2016-11-05 65 views
0

IGrouping:为什么IGrouping继承像IEictionary一样的IEnumerable <KeyValuePair>?

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实现的方法,将用于IGroupingIDictionary.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错?我错过了什么?

回答

1

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

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

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

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

如果您最终需要个别值,您也可以使用ToLookup

相关问题