如何使用Linq </object>从List <object>中获取第一个对象

时间:2013-04-23 08:11:53

标签: c# .net linq c#-4.0

我在c#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");
}

10 个答案:

答案 0 :(得分:68)

尝试:

var firstElement = lstComp.First();

如果FirstOrDefault()不包含任何项目,您也可以使用lstComp

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

修改

获取Component Value

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

这假设lstComp中有一个元素。另一种更安全的方式是......

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

答案 1 :(得分:6)

无论发生什么情况,

[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");
}

答案 2 :(得分:2)

你可以做到

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     

答案 3 :(得分:1)

你也可以使用它:

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

答案 4 :(得分:1)

你可以像这样使用linq表达式:

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

表示你可以像这样使用的lambda表达式

列表列表=新列表(){1,2,3};             int x = list.FirstOrDefault();

答案 5 :(得分:0)

有很多这样的方法:
.First .FirstOrDefault .Single .SingleOrDefault
选择最适合你的。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

首先尝试获取所有列表,然后获取所需的元素(比如你的第一个):

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获取列表,然后是您的元素。在第二种情况下,您可以直接获得价值。

相同的结果,不同的计算;)

答案 8 :(得分: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>>();

//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类或子项

的对象时

答案 9 :(得分:0)

我这样做。

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

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