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
} IGrouping
中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)){...}
不可用,这意味着任何尝试在组中找到密钥的方法(在O(1)时间)看起来像:
IGrouping
我只是使用{{1}}错了吗?我错过了什么?
答案 0 :(得分:2)
要查找特定IGrouping<TKey, TValue>
是否包含特定TKey
,请直接检查其Key
属性。不需要循环。
GroupBy
未返回IGrouping
,它会返回IEnumerable<IGrouping<...>>
。也就是说,IGrouping
表示单个键值的结果,并且您会得到多个这样的结果。它无法返回Dictionary<TKey, TValue>
,因为GroupBy
会保留关键顺序,Dictionary
则不会。此处没有其他预先存在的集合类型。
由于您不关心按键顺序,也不关心每个按键的各个值(因为它们相同),您可以自己将结果存储在字典中,就像您现在正在做的那样。你正在做正确的事。
如果您不需要计数,也可以使用HashSet<int>
。
如果您最终需要单个值,您还可以使用ToLookup
。