繁体   English   中英

为什么IGrouping不继承IEnumerable <KeyValuePair> 喜欢IDictionary?

[英]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.ContainsKeyIGrouping中不可用,这意味着在组上(在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM