C#LINQ获取字典的第一个列表项<string,list <object =“”>&gt;

时间:2017-12-01 19:07:12

标签: c# linq

我有一个列表字典,我想获得字典中每个列表的第一个元素的列表。基本上是:

    Dictionary<string, List<object>> dico = new Dictionary<string, List<Object>>();

    // fill data...

   List<object> list = new List<Object>();
   foreach(var value in dico.Values)
   {
        list.Add(value.ElementAt(0));
   }

可以用LINQ完成吗。

非常感谢。

1 个答案:

答案 0 :(得分:4)

Dictionary实现IEnumerable<KeyValuePair>,这样您就可以从每个值投影到您想要的值,然后转换为列表:

var list = dico.Select(p => p.Value[0]).ToList();

如果您关注空的List或缺少(null)列表,则可以保护投影:

var list = dico.Select(p => p.Value?.FirstOrDefault()).ToList();

PS我认为ElementAtOrDefaultList的方法,或者至少是List的特殊方法,但事实并非如此。我想知道为什么.Net使用类型转换来检查List,而不是在知道静态类型时的特殊情况:

public static T ElementAtOrDefault<T>(this List<T> src, int index) => src.Count > index ? src[index] : default(T);

快速测试表明,List的扩展方法快20倍。