无法理解linq查询

时间:2012-07-17 04:37:02

标签: c# linq

我在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,我们希望获得所有国家/地区的此信息。请任何人都可以一步一步地定义它。谢谢

注意:此查询已编译,没有错误且工作正常

2 个答案:

答案 0 :(得分:2)

让我们一步一步地查看查询

SelectMany获取拆分','并将各种拆分组合成单个IEnumerable

  

将序列的每个元素投影到IEnumerable,并将生成的序列展平为一个序列。

因此,在该阶段,您已将数组arr1转换为单个IEnumerable<string>,其值类似于USA:2

GroupBy然后分组IEnumberable<string>。它使用':'字符将USA:2之类的每个条目拆分。左侧是分组键,右侧是值。

  

根据指定的键选择器函数对序列的元素进行分组。

ToDictionary将该分组转换为字典。 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的次数)并返回该计数。< / p>

答案 1 :(得分: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在一组和印度,3和印度,4在其他组别与其他国家一样。

        .ToDictionary(g => g.Key,

现在正在逐一考虑关键,首先是巴基斯坦,印度,伊朗等。

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

此项使其Count条目进入ItemCollection,就像巴基斯坦在Enumerable中包含4,0用于下一次计算。

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

逐个获取项目并存储在结果变量中,g.count现在正在检查相同数量的条目数量,例如巴基斯坦有4次2次和0次单独时间,像印度一样有2次和2次4次。

                 return result;
             });

Rest正在获取代码并在控制台上显示。