私たちは多くの場合、Listなどのメモリコレクション内の1つまたはいくつかの属性に従ってをグループ化し、統計を表示します。最も簡単に考える方法は、特定のキー属性に基づいて List インスタンスをトラバースし、それを次の辞書型
Dictionary<string, List<MyObject>
に変換することです。たとえば、指定された車の場合、
List<Car> cars = new List<Car>(){ new Car(1,"audiA6","private"), new Car(2,"futon","merchant"), new Car(3,"feiren","bike"), new Car(4,"bukon","private"), new Car(5,"baoma","private"), new Car(6,"dayun","merchant") };
は ID をキーとして使用し、値を Car として使用したいと考えています。それを辞書 idCarDict に変換するには、最も複雑なロジックを持ち、最も多くのコードを必要とするこのメソッドをトラバースすることに加えて、ToDictionary メソッド
ar idCarDict = cars.ToDictionary(car=>car.id);
を直接使用することもできます。ただし、このメソッドには制限があり、キー コードに対応する object の 1 つのインスタンス、つまり、返される型は
Dictionary<string,Object>
です。1 つのキー コードが複数のインスタンスに対応する可能性があるため、これは問題です。この場合、キー コードでグループ化するには GroupBy を使用する必要があります。まずそれを辞書に変換します。
たとえば、このモデルで複数の車を取得するためのキーとして type を使用したいとします。
Dictionary<string, List<Car>> typeCarDict = cars.GroupBy(car => car.type). ToDictionary(g => g.Key, g => g.ToList());
この変換コードはシンプルで、次の走査ロジックよりもはるかに優れています。
var dict = new Dictionary<string,List<Car>>();foreach(var car in cars) { if(dict.Contains(car.type)) dict[car.type].Add(car); else dict.Add(car.type,new List<Car>(){car}));}
これで、複数のインスタンスに対応する 1 つのキー コードの問題は解決されます。では、複数のインスタンスに対応する複数のキー コードの問題は、List 上の GroupBy を使用して実現できますか? 達成できません。
この時点で、複数のキーコードを新しいオブジェクトに結合するための Linq ステートメントを記述する必要があります
new {key1, key2, ...}
例として、コレクション内の要素は 2 つの整数を含みます。要素は、Val1 の方が小さく、Val2 の方が相対的に大きくなります。 Val1とVal2の組み合わせに従ってグループ化するにはどうすればよいですか?
以下のロジックを参照してください:
static void printfDuplicateCompare(List<ValPair> compares) { //按组合键分组后,每组元素个数大于2的分组,按降序排序 var rtnByVal1 = from item in compares group item by new { item.Val1, item.Val2 } into g where g.Count()>1 orderby g.Count() descending select g; //按Val1和Val2组合为字典键,元素个数为值 var dict = rtnByVal1.ToDictionary(g => g.Key,g=>g.Count()); }
概要
List の GroupBy は 1 つのキーに基づいてのみグループ化できます。複数のキーの組み合わせに基づいてグループ化する必要がある場合は、Linq ステートメントの組み合わせを記述する必要があります。
以上が.NET Framework - コレクションと LINQ の技術コードの「グループ化」の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。