Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法理解linq查询_C#_Linq - Fatal编程技术网

C# 无法理解linq查询

C# 无法理解linq查询,c#,linq,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",

我在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]);
            }
        }
string[]arr1=新字符串[]
{
“巴基斯坦:4,印度:3,美国:2,伊朗:1,英国:0”,
“巴基斯坦:4,印度:3,美国:2,伊朗:1,英国:0”,
印度:4,美国:3,伊朗:2,英国:1,巴基斯坦:0
};
var计数=arr1
.SelectMany(s=>s.Split(新[]{',},StringSplitOptions.RemoveEmptyEntries))
.GroupBy(s=>s.Split(“:”)[0],s=>s.Split(“:”)[1])
.ToDictionary(g=>g.Key,
g=>
{
var items=g.Distinct();
var result=newdictionary();
foreach(项目中的var项目)
结果[项目]=g.Count(gitem=>gitem==item);
返回结果;
});
//打印结果
foreach(计数键中的var国家/地区)
{
foreach(计数[国家/地区]中的变量发生率。键)
{
WriteLine(“{0}:{1}={2}”,country,ocurrence,count[country][ocurrence]);
}
}
此查询的目的

执行此查询是为了实现这一点:我们想知道巴基斯坦有多少次出现“0”,有多少次出现“1”、2、3、4,我们想得到所有国家的这些信息。请大家一步一步地定义它。谢谢

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

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();
此项使其计数条目进入ItemCollection,如巴基斯坦包含4,0,可用于下一次计算

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

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

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

获取“,”上的拆分结果,并将各种拆分组合回单个IEnumerable

将序列的每个元素投影到IEnumerable,并将结果序列展平为一个序列

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

然后分组
IEnumberable
。它使用“:”字符拆分每个条目,如
USA:2
。左侧是分组键,右侧是值

根据指定的键选择器功能对序列的元素进行分组

将该分组转换为字典。字典条目的键是分组键(例如
USA
)。字典条目的值是一个新的(匿名)对象:

g=>
{
var items=g.Distinct();
var result=newdictionary();
foreach(项目中的var项目)
结果[项目]=g.Count(gitem=>gitem==item);
返回结果;
}

匿名对象是通过遍历并计算给定计数的唯一出现次数(例如,如果键为
USA
,则值
1
)来构造的,并返回该计数。

是否尝试读取每个方法的值?实际上,我问了一个关于堆栈溢出的问题,有人给了我这个答案,但我无法理解这一点。我阅读了文档,但没有得到任何关于我的情况的帮助。您以前使用过Linq查询吗?没有,这就是我无法理解的原因。我不同意这是“过于本地化”的说法。与入门教程相比,这是一个复杂的Linq查询。对任何Linq初学者来说,看到这样一个查询被剖析都是很有启发性的,即使它不是他们正在处理的查询。
                 return result;
             });
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;
             }