我有一个分隔文件,我正在读取一个字符串数组(文件没有标题),然后尝试使用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背景很扎实。只是很难转换我所知道的东西。任何帮助表示赞赏!
答案 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(),
});