1

linqにクエリがありますが、このクエリを作成しなかったため、理解できません。クエリは以下のとおりです

string[] arr1 = new string[]
                        {
                            "Pakistan:4,India:3,USA:2,Iran:1,UK:0",
                            "Pakistan:4,India:3,USA:2,Iran:1,UK:0",
                            "India:4,USA:3,Iran:2,UK:1,Pakistan:0"
                        };

        var count = arr1
            .SelectMany(s => s.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
            .GroupBy(s => s.Split(':')[0], s => s.Split(':')[1])
            .ToDictionary(g => g.Key,
                 g =>
                 {
                     var items = g.Distinct();
                     var result = new Dictionary<String, int>();
                     foreach (var item in items)
                         result[item] = g.Count(gitem => gitem == item);
                     return result;
                 });


        // print the result
        foreach (var country in count.Keys)
        {
            foreach (var ocurrence in count[country].Keys)
            {
                Console.WriteLine("{0} : {1} = {2}", country, ocurrence, count[country][ocurrence]);
            }
        }

このクエリの目的

このクエリは、これを実現するために実行されます。パキスタンに「0」が付いた回数、「1」が付いた回数、2、3、4を知りたいので、すべての国についてこの情報を取得したいと思います。誰でも段階的に定義できますか?ありがとう

注:このクエリはコンパイルされ、エラーがなく、正しく機能しています

4

2 に答える 2

2

クエリを段階的に見てみましょう

SelectManyは、',' で分割した結果を取得し、さまざまな分割を単一の IEnumerable に結合します。

シーケンスの各要素を IEnumerable に射影し、結果のシーケンスを 1 つのシーケンスにフラット化します。

その段階で、配列を次のような値arr1を持つ単一の配列に変換しましたIEnumerable<string>USA:2

GroupByはそれをグループ化しIEnumberable<string>ます。USA:2「:」文字を使用するように、各エントリを分割します。左側がグループ化キーで、右側が値です。

指定されたキー セレクター関数に従って、シーケンスの要素をグループ化します。

ToDictionaryは、そのグループ化を Dictionary に変換します。Dictionary エントリのキーは、グループ化キーです (例: USA)。Dictionary エントリの値は、新しい (匿名の) オブジェクトです。

g =>
             {
                 var items = g.Distinct();
                 var result = new Dictionary<String, int>();
                 foreach (var item in items)
                     result[item] = g.Count(gitem => gitem == item);
                 return result;
             }

匿名オブジェクトは、指定されたカウント (たとえば、キーが の場合USA、値が何回1) の一意の発生を調べてカウントすることによって構築され、そのカウントを返します。

于 2012-07-17T04:58:51.240 に答える
0
var count = arr1
        .SelectMany(s => s.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))

上記のメソッドは、アイテムを で分割しようとするため、パキスタン:4 、インド:3 のような次のプロセスのために各アイテムを個別に取得します。

        .GroupBy(s => s.Split(':')[0], s => s.Split(':')[1])

この Groupby は、パキスタン 4 とパキスタン 0 を 1 つのグループに、インド 3 とインド 4 を他のグループのように、すべて同じ国に参加させています。

        .ToDictionary(g => g.Key,

現在、パキスタン、インド、イランなどのように、キーを 1 つずつ検討しています。

             g =>
             {
                 var items = g.Distinct();

このアイテムは、パキスタンのように ItemCollection に Count エントリを作成し、次の計算のために Enumerable に 4,0 を含みます。

                 var result = new Dictionary<String, int>();
                 foreach (var item in items)
                     result[item] = g.Count(gitem => gitem == item);

アイテムを 1 つずつ取得し、結果変数にも格納します。g.count は、同じカウントに対していくつのエントリがあるかをチェックしています。 .

                 return result;
             });

残りはコードを取得し、コンソールに表示しています。

于 2012-07-17T04:57:00.097 に答える