我在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,我们希望获得所有国家/地区的此信息。请任何人都可以一步一步地定义它。谢谢
注意:此查询已编译,没有错误且工作正常
答案 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正在获取代码并在控制台上显示。