ILookup<TKey, TVal=""> 対IGrouping<TKey, TVal="">
質問
私はやっているのでトラブルの明確との違い ILookup<TKey, TVal>
や IGrouping<TKey, TVal>
, が、好奇心かを用い、正しく表してください。LINQ配合の問題を配列 IGrouping
項目をもた ToLookup
延長方法。かのように感じましたがった大会でも同じことが言えますか。
var q1 =
from n in N
group n by n.MyKey into g
select g;
// q1 is IEnumerable<IGrouping<TKey, TVal>>
に相当する:
var q2 = N.GroupBy(n => n.MyKey, n => n);
// q2 is IEnumerable<IGrouping<TKey, TVal>>
る多くのように:
var q3 = N.ToLookup(n => n.MyKey, n => n);
// q3 is ILookup<TKey, TVal>
私正し、次の工夫?
- An
IGrouping<TKey, TVal>
シングルールディングスキsequenceに類似KeyValuePair<TKey, TVal>
の値は、実際には、配列の要素は単一の要素) - An
IEnumerable<IGrouping<TKey, TVal>>
は配列の似ただく場合、繰り返し処理を行IDictionary<TKey, TVal>
- An
ILookup<TKey, TVal>
はいない。IDictionary<TKey, TVal>
の値は、実際には、配列の要素
解決
はい、それらのすべてが正しいです。
そして、あなたはすべてのキー/コレクションのペアを反復と同様に(または代わりに)だけで、特定のキーを調べることができるようにILookup<TKey, TValue>
もIEnumerable<IGrouping<TKey, TValue>>
を拡張します。
私は基本的にILookup<TKey,TValue>
のようなものIDictionary<TKey, IEnumerable<TValue>>
を考えます。
ベア心の中でToLookup
が延期されたのに対し、GroupBy
は「今それを行う」操作(即時実行)であること。それはあなたがIGrouping
の結果からGroupBy
sを引っ張って起動したときに、作品「LINQを引っ張る」という方法で、偶然にも、それは他の実装における一方(あなたを介してグループを途中で切り替えることができないので)とにかく、すべてのデータを読み取るために持っていることストリーミング結果を生成することができるかもしれません。 (これは、プッシュLINQでない;私は同じようにイベントへのLINQを期待する)
他のヒント
ILookupとIDictionaryの間にもう一つの重要な違いがあります:前者は、ここに(消費者が明示的なキャストを実行する場合を除いて)データを変更するための方法が提供されていないという意味で不変性を強制します。これとは対照的に、IDictionaryのは、データを変更可能にする「追加」のようなメソッドを持っています。したがって、機能的プログラミングおよび/または並列プログラミングの観点から、ILookupは進歩して。 (私はキーではなくグループに唯一の値を代入ILookupのバージョンもあったたい。)
(。ところで、それはIEnumerableをとのIListの関係はILookupとIDictionaryを間ものと幾分類似していることを指摘する価値があると思われる - 前者は不変であり、後者ではない。)
GroupBy
や ToLookUp
ほとんど同じ機能を を除く この: 参考
GroupBy:のGroupByオペレーターを返します団体の要素に基づくも キーの値です。各グループに代表されるIGrouping オブジェクトです。
ToLookup:ToLookupと同じGroupBy;唯一の違い の実行GroupByは繰り延べに対しToLookup実行 きます。
能の差を利用サンプルコードです。うするには、こちらをクリックしてクラスを表す Person
モデル:
class Personnel
{
public int Id { get; set; }
public string FullName { get; set; }
public int Level { get; set; }
}
その後、このリスト personnels
下記の通りとなります。
var personnels = new List<Personnel>
{
new Personnel { Id = 1, FullName = "P1", Level = 1 },
new Personnel { Id = 2, FullName = "P2", Level = 2 },
new Personnel { Id = 3, FullName = "P3", Level = 1 },
new Personnel { Id = 4, FullName = "P4", Level = 1 },
new Personnel { Id = 5, FullName = "P5", Level =2 },
new Personnel { Id = 6, FullName = "P6", Level = 2 },
new Personnel { Id = 7, FullName = "P7", Level = 2 }
};
いく必要がある personnels
グループ化しやすいでしょう。私は二つのアプローチです。を使用 GroupBy
または ToLookUp
.を利用した場合、 GroupBy
, 表に記載されている前で使用繰延実行するときにコレクションの反復処理のクラスタ間のレプリケーションでは計算しなければならなでることが求められています。
var groups = personnels.GroupBy(p => p.Level);
personnels.RemoveAll(p => p.Level == 1);
foreach (var product in groups)
{
Console.WriteLine(product.Key);
foreach (var item in product)
Console.WriteLine(item.Id + " >>> " + item.FullName + " >>> " + item.Level);
}
上記のコードは、まずグループ化の personnels
, が、前に繰り返し処理では、一部削除 personnels
.として GroupBy
使用繰延実行で最終的な結果はあまり使わないのでわかりません削除された項目で分類するコンピューティングの foreach
点です。
出力:
2
2 >>> P2 >>> 2
5 >>> P5 >>> 2
6 >>> P6 >>> 2
7 >>> P7 >>> 2
だし書き換えに上記のコードを下記の通りとなります。(コードとして以前のコードを除く GroupBy
に置き換え ToLookUp
)
var groups = personnels.ToLookup(p => p.Level);
personnels.RemoveAll(p => p.Level == 1);
foreach (var product in groups)
{
Console.WriteLine(product.Key);
foreach (var item in product)
Console.WriteLine(item.Id + " >>> " + item.FullName + " >>> " + item.Level);
}
として ToLookUp
用途即時実行する呼び出し ToLookUp
方法、結果が生成され、グループを用いれば削除いずれかの項目から personnels
事前の繰り返し、ポー効果を最終成績とする。
出力:
1
1 >>> P1 >>> 1
3 >>> P3 >>> 1
4 >>> P4 >>> 1
2
2 >>> P2 >>> 2
5 >>> P5 >>> 2
6 >>> P6 >>> 2
7 >>> P7 >>> 2
注意: GroupBy
や ToLookUp
両方の異なる種類です。
利用する場合もあるでしょうToDictionaryの代わりにToLookUpんに注意を払っていく必要があります:(参考)
利用ToLookup()と同じであるToDictionary(), 両方のできる指定のキーのセレクタの値のセレクタ、 comparers.主な違いは、ToLookup()できる( 期待の重複キーはToDictionaryません