Подтвердить что ты не робот

Как получить первый объект из списка <Object> с помощью Linq

У меня есть код ниже в С# 4.0.

//Dictionary object with Key as string and Value as List of Component type object
Dictionary<String, List<Component>> dic = new Dictionary<String, List<Component>>();

//Here I am trying to do the loping for List<Component>
foreach (List<Component> lstComp in dic.Values.ToList())
{
    // Below I am trying to get first component from the lstComp object.
    // Can we achieve same thing using LINQ?
    // Which one will give more performance as well as good object handling?
    Component depCountry = lstComp[0].ComponentValue("Dep");
}
4b9b3361

Ответ 1

Try:

var firstElement = lstComp.First();

Вы также можете использовать FirstOrDefault() на всякий случай, если lstComp не содержит никаких элементов.

http://msdn.microsoft.com/en-gb/library/bb340482(v=vs.100).aspx

Edit:

Чтобы получить Component Value:

var firstElement = lstComp.First().ComponentValue("Dep");

Это предполагает, что есть элемент в lstComp. Альтернативный и безопасный способ будет...

var firstOrDefault = lstComp.FirstOrDefault();
if (firstOrDefault != null) 
{
    var firstComponentValue = firstOrDefault.ComponentValue("Dep");
}

Ответ 2

[0] или .First() даст вам ту же производительность, что и все. Но ваш Dictionary может содержать IEnumerable<Component> вместо List<Component>, а затем вы не можете использовать оператор []. Вот где разница огромна.

Итак, для вашего примера это не имеет особого значения, но для этого кода у вас нет выбора использовать First():

var dic = new Dictionary<String, IEnumerable<Component>>();
foreach (var components in dic.Values)
{
    // you can't use [0] because components is an IEnumerable<Component>
    var firstComponent = components.First(); // be aware that it will throw an exception if components is empty.
    var depCountry = firstComponent.ComponentValue("Dep");
}

Ответ 3

Вы также можете использовать это:

var firstOrDefault = lstComp.FirstOrDefault();
if(firstOrDefault != null) 
{
    //doSmth
}

Ответ 4

для выражения linq, которое вы можете использовать следующим образом:

 List<int> list = new List<int>() {1,2,3 };
        var result = (from l in list
                     select l).FirstOrDefault();

для выражения лямбда, которое вы можете использовать следующим образом

Список list = new List() {1, 2, 3};           int x = list.FirstOrDefault();

Ответ 5

Вы можете сделать

Component depCountry = lstComp
                       .Select(x => x.ComponentValue("Dep"))
                       .FirstOrDefault();

Альтернативно, если вы хотите этого для всего словаря значений, вы можете даже привязать его к ключу

var newDictionary = dic.Select(x => new 
            {
               Key = x.Key,
               Value = x.Value.Select( y => 
                      {
                          depCountry = y.ComponentValue("Dep")
                      }).FirstOrDefault()
             }
             .Where(x => x.Value != null)
             .ToDictionary(x => x.Key, x => x.Value());

Это даст вам новый словарь. Вы можете получить доступ к значениям

var myTest = newDictionary[key1].depCountry     

Ответ 6

Есть куча таких методов:
.First .FirstOrDefault .Single .SingleOrDefault
Выберите, который подходит вам лучше всего.

Ответ 7

var firstObjectsOfValues = (from d in dic select d.Value[0].ComponentValue("Dep"));

Ответ 8

Попробуйте сначала получить весь список, затем ваш желаемый элемент (скажем, первый в вашем случае):

var desiredElementCompoundValueList = new List<YourType>();
dic.Values.ToList().ForEach( elem => 
{
   desiredElementCompoundValue.Add(elem.ComponentValue("Dep"));
});
var x = desiredElementCompoundValueList.FirstOrDefault();

Чтобы получить прямо первое значение элемента без большого количества итераций foreach и присваивания переменных:

var desiredCompoundValue = dic.Values.ToList().Select( elem => elem.CompoundValue("Dep")).FirstOrDefault();

Посмотрите разницу между двумя подходами: в первом вы получите список через ForEach, затем ваш элемент. Во втором вы можете получить свою ценность в прямой форме.

Тот же результат, разные вычисления;)

Ответ 9

Я бы так:

//Dictionary object with Key as string and Value as List of Component type object
Dictionary<String, List<Component>> dic = new Dictionary<String, List<Component>>();

//from each element of the dictionary select first component if any
IEnumerable<Component> components = dic.Where(kvp => kvp.Value.Any()).Select(kvp => (kvp.Value.First() as Component).ComponentValue("Dep"));

но только если он уверен, что список содержит только объекты класса Component или дочерних элементов

Ответ 10

Я делаю это.

List<Object> list = new List<Object>();

if(list.Count>0){
  Object obj = list[0];
}