LINQ查询字符串[]group by多个匿名列



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

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

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

1000200034, 2015年,美国广播公司、1

1000200034, 2015, DEF 2

我想按第一列和第二列分组,忽略第三列,并对第四列求和。

返回:

1000200034, 2015,

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

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背景很扎实。只是很难转化我所知道的东西。任何帮助都是感激的!

问题是由于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(),
    });

最新更新