[英]Difference between IDictionary and IEnumerable<KeyValuePair>
[英]Why doesn't IGrouping inherit IEnumerable<KeyValuePair> like IDictionary?
IGrouping:
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<KeyValuePair<TKey, TValue>>
而IGrouping
实现IEnumerable<TElement>
。 如果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
错误吗? 我想念什么?
要查找特定的IGrouping<TKey, TValue>
包含特定的TKey
,只需直接检查其Key
属性。 无需循环。
GroupBy
不返回IGrouping
,而是返回IEnumerable<IGrouping<...>>
。 也就是说, IGrouping
代表一个键值的结果,您将获得多个这样的结果。 它不能返回Dictionary<TKey, TValue>
,因为GroupBy
保留键顺序,而Dictionary
不保留。 这里没有其他合适的现有收集类型。
由于您既不在乎键顺序,也不在乎每个键的单个值(因为它们相同),因此您可以像现在一样将结果存储在字典中。 你做对了。
如果不需要计数,也可以使用HashSet<int>
。
如果最终需要各个值,则也可以使用ToLookup
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.