2016-11-05 19 views
0

IGrouping:IGroupingがIDictionaryのように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>>IGroupingIEnumerable<TElement>を実装しながら。 IGroupingの要素にキーが含まれている場合、インターフェイスでもKeyValuePairを使用しないのはなぜですか?

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)){...} 
:それはまた次のようになります((1)時間Oに)グループのキーを見つけるしようとする試みを意味し、 IGroupingに利用できない IGroupingなど IDictionary.ContainsKeyなどのために有用であろう IDictionaryに実装された方法のように思えます

私はちょうどIGroupingを間違って使用していますか?私は何が欠けていますか?

答えて

1

特定のIGrouping<TKey, TValue>に特定のTKeyが含まれているかどうかを確認するには、そのKeyプロパティを直接チェックしてください。ループの必要はありません。

GroupByIGroupingを返していない場合は、IEnumerable<IGrouping<...>>を返します。つまり、IGroupingは1つの単一キー値の結果を表し、そのような結果は複数得られます。 GroupByはキーオーダーを維持し、Dictionaryは返さないので、Dictionary<TKey, TValue>を返すことはできません。ここには他の既存のコレクションタイプは適切ではありません。

キーの順序は気にせず、各キーの個々の値は同じであるため気にする必要はないため、実行しているように自分で辞書に結果を保存できます今。あなたは正しいことをやっている。

カウントが不要な場合は、HashSet<int>も使用できます。

個々の値が必要になった場合は、ToLookupも使用できます。

関連する問題