【问题标题】:C# LINQ get first list items of a dictionary<string, List<object>>C# LINQ 获取字典的第一个列表项<string, List<object>>
【发布时间】:2017-12-01 19:07:11
【问题描述】:

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

    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 完成吗?

非常感谢。

【问题讨论】:

  • "这可以用 LINQ 完成吗?"嗯,是的。这就是你所做的。你在找什么?
  • 你能展示你的尝试吗?
  • 既然有List&lt;object&gt;,为什么还要使用ElementAt?只需执行value[0],尽管如果列表为空,两种情况下都会出现异常。

标签: c# linq


【解决方案1】:

Dictionary 实现了IEnumerable&lt;KeyValuePair&gt;,因此您可以将每个值投影到您想要的值,然后转换为列表:

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

如果您担心Lists 为空或缺少 (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 倍。

【讨论】:

  • 你不能用FirstOrDefault()吗?
  • @maccettura 是的。我以为ElementAtOrDefault 是特殊情况或List 上的方法,但它的主体内部有List 的特殊情况。
  • I wonder why .Net uses type conversion to check for List instead of also a special case for when static types are known: 它的构建方式意味着即使您的List 已在某处转换为IEnumerable,您也可以获得性能优势。 docs.microsoft.com/en-us/dotnet/standard/design-guidelines/… -> Instead, consider using IEnumerable&lt;T&gt; or IEnumerable and dynamically checking whether the object implements ICollection&lt;T&gt; or ICollection.
  • 有趣的是,参考源检查IList,因为它使用索引。我不建议从ElementAtOrDefault(IEnumerable) 中删除该检查,只需添加额外的静态类型版本。
  • 这样做会有什么好处? 现有方法具有相同的好处,只需要一种方法。
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
相关资源
最近更新 更多