为什么IGrouping不像IDictionary那样继承IEnumerable <keyvaluepair>?

时间:2016-11-05 17:35:48

标签: c#

IGrouping:

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

的IDictionary:

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

因此,IDictionary实施IEnumerable<KeyValuePair<TKey, TValue>>IGrouping实施IEnumerable<TElement>。如果IGrouping的元素包含键,为什么界面也不使用KeyValuePair?似乎IDictionary中实现的IGrouping有用的方法(例如IDictionary.ContainsKey} IGroupingList<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)){...} 不可用,这意味着任何尝试在组中找到密钥的方法(在O(1)时间)看起来像:

IGrouping

我只是使用{{1}}错了吗?我错过了什么?

1 个答案:

答案 0 :(得分:2)

要查找特定IGrouping<TKey, TValue>是否包含特定TKey,请直接检查其Key属性。不需要循环。

GroupBy未返回IGrouping,它会返回IEnumerable<IGrouping<...>>。也就是说,IGrouping表示单个键值的结果,并且您会得到多个这样的结果。它无法返回Dictionary<TKey, TValue>,因为GroupBy会保留关键顺序,Dictionary则不会。此处没有其他预先存在的集合类型。

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

如果您不需要计数,也可以使用HashSet<int>

如果您最终需要单个值,您还可以使用ToLookup