【问题标题】:Why doesn't IGrouping inherit IEnumerable<KeyValuePair> like IDictionary?为什么 IGrouping 不像 IDictionary 那样继承 IEnumerable<KeyValuePair>?
【发布时间】:2016-11-06 01:56:51
【问题描述】:

分组:

public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, 
IEnumerable

字典:

public interface IDictionary<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>, 
IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

所以,IDictionary 实现了IEnumerable&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;,而IGrouping 实现了IEnumerable&lt;TElement&gt;。如果IGrouping的元素包含键,为什么界面不也使用KeyValuePair?似乎在IDictionary 中实现的对IGrouping 有用的方法(例如IDictionary.ContainsKey)在IGrouping 中不可用,这意味着任何在组上查找键的尝试(在 O(1) 时间内)看起来类似:

List<int> myList = new List<int>{ 1, 2, 3, 1};
var grp = myList.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count());
if (grp.ContainsKey(someValue)){...}

我只是使用IGrouping 错了吗?我错过了什么?

【问题讨论】:

    标签: c#


    【解决方案1】:

    要查找特定的IGrouping&lt;TKey, TValue&gt; 是否包含特定的TKey,只需直接检查其Key 属性即可。不需要循环。

    GroupBy 不返回 IGrouping,它返回 IEnumerable&lt;IGrouping&lt;...&gt;&gt;。也就是说,IGrouping 代表一个键值的结果,而您会得到多个这样的结果。它不能返回Dictionary&lt;TKey, TValue&gt;,因为GroupBy 保留了密钥顺序,而Dictionary 没有。此处没有其他适合的现有集合类型。

    由于您不关心键顺序,也不关心每个键的各个值(因为它们是相同的),您可以自己将结果存储在字典中,就像您现在所做的那样.你做对了。

    如果您不需要计数,也可以使用HashSet&lt;int&gt;

    如果您最终需要单独的值,您也可以使用ToLookup

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多