2012-07-17 42 views
1

我在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,我们希望为所有国家获取这些信息。请任何人都可以定义它步步.Thanks

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

+1

您是否尝试阅读每种方法的[documentation](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx)? – 2012-07-17 04:43:42

+0

实际上,我问了一个关于堆栈溢出的问题,有人给了我这个答案,但我无法理解这一点。我阅读文档,但没有得到任何帮助我的情况 – user1441945 2012-07-17 04:53:46

+0

你以前使用过Linq查询吗? – NoviceProgrammer 2012-07-17 04:56:15

回答

2

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

SelectMany呈现分裂的结果“”并结合各种分裂回单的IEnumerable

项目每一个序列来元一个IEnumerable并将结果序列展平成一个序列。

所以在那个阶段,您已转换的阵列arr1成单个IEnumerable<string>与值等等USA:2

GroupBy然后基团IEnumberable<string>。它使用':'字符分割每个条目,如USA:2。左侧是分组键,右侧是值。

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

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

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)并返回该计数。

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(); 

该项目使得其计数输入到ItemCollection像巴基斯坦包含在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次2次4次。

    return result; 
      }); 

其余的是获取代码并显示在控制台上。