LINQ查询字符串[]由多个匿名列组成

时间:2015-06-04 17:25:39

标签: c# arrays string linq group-by

我有一个分隔文件,我正在读取一个字符串数组(文件没有标题),然后尝试使用LINQ查询进行解析。

我想通过多个匿名列(使用数组索引)进行分组,然后对其中一个字段求​​和。

例如,假设我有一个格式为的文件:

  

1000200034,2015,ABC,1

     

1000200034,2015,DEF,2

我希望按第一列和第二列分组,忽略第三列,并将第四列相加。

所以我回来了:

  

1000200034,2015,3

当我按单列分组时,我可以得到结果以返回总和:

IEnumerable<string[]> query = from row in data
                    where row[0] == "1000200034"
                    group row by row[0] into g
                    select new string[]
                    {
                        g.Key,
                        g.Sum(a=>int.Parse(a.ElementAt(3))).ToString(),   
                    };

但是如果我尝试添加其他列,我不再得到总和,我会返回两行:

 IEnumerable<string[]> query = from row in data
                    where row[0] == "1000200034"
                    group row by new[]{row[0], row[1]} into g
                    select new string[]
                    {
                        g.Key[0],
                        g.Key[1],
                        g.Sum(a=>int.Parse(a.ElementAt(3))).ToString(),   
                    };

我对LINQ和C#很新,但我的SQL背景很扎实。只是很难转换我所知道的东西。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:5)

问题是由于new []分组,它应该只是new,您还必须为组中使用的匿名类型指定字段名称,例如:

IEnumerable<string[]> query = from row in data
                              where row[0] == "1000200034"
                              group row by new { FirstKey = row[0], SecondKey = row[1] } into g
                              select new string[]
        {
            g.Key.FirstKey,
            g.Key.SecondKey,
            g.Sum(a=>int.Parse(a.ElementAt(3))).ToString(),   
        };

使用方法语法,它应该如下所示:

IEnumerable<string[]> query2 = data.Where(row => row[0] == "1000200034")
    .GroupBy(row => new { FirstKey = row[0], SecondKey = row[1] })
    .Select(grp => new string[]
    {
        grp.Key.FirstKey,
        grp.Key.SecondKey,
        grp.Sum(a => int.Parse(a.ElementAt(3))).ToString(),
    });