ホームページ > バックエンド開発 > C#.Net チュートリアル > .NET Framework - コレクションと LINQ の技術コードの「グループ化」の詳細な説明

.NET Framework - コレクションと LINQ の技術コードの「グループ化」の詳細な説明

黄舟
リリース: 2017-03-18 13:13:28
オリジナル
1599 人が閲覧しました

私たちは多くの場合、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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート