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 并将生成的序列展平为一个序列。

因此,在那个阶段,您已将数组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)并返回该计数来构造。

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

上述方法尝试将 Items 拆分为 ,因此它将单独获取每个项目以用于下一个流程,例如 Pakistan:4 , India:3

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

这个 Groupby 加入了所有同一个国家,他们的数量像巴基斯坦,4 和巴基斯坦,0 在一个组中,印度,3 和印度,4 在另一个组中,就像其他人一样。

        .ToDictionary(g => g.Key,

现在它正在像首先考虑巴基斯坦,印度,伊朗等一样一个一个地考虑关键。

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

此项目使其计数条目进入 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 次两次和 0 次一次,就像印度有 3 次和 4 次一样.

                 return result;
             });

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

于 2012-07-17T04:57:00.097 回答