如果之前有人问过,请道歉,但我不确定我是否提出了正确的问题。 这是我的问题:
我有
等数据AA01 JAN 100
AA01 JAN 200
AA01 FEB 200
AA02 JAN 50
AA03 FEB 500
AA03 MAR 250
AA03 MAR 75
我想把它变成IEnumerable的结果,看起来像是:
Result{
string Key,
int Jan,
int Feb,
int Mar,
...
}
IEnumerable<Result> results = .....
KEY JAN FEB MAR
AA01 300 200 0
AA02 50 0 0
AA03 0 500 325
月份列是固定的,如果这有帮助,但我无法弄清楚如何获得linq查询来产生这些结果? 我可以重复迭代数据并在标准循环中添加结果,但这听起来像是错误的方式。
感谢您的任何帮助:)
答案 0 :(得分:1)
这是我知道如何最简单的方式:
var query =
from r in records
group r by r.Key into grs
let ms = grs.ToLookup(gr => gr.Month, gr => gr.Value)
select new
{
grs.Key,
JAN = ms["JAN"].Sum(),
FEB = ms["FEB"].Sum(),
MAR = ms["MAR"].Sum(),
// ...
DEC = ms["DEC"].Sum(),
};
从计算的角度来看,不完全以您想要的格式更灵活的替代方案是:
var months = Enumerable
.Range(0, 12)
.Select(m =>
String
.Format("{0:MMM}", new DateTime(2011, m + 1, 1))
.ToUpper());
var query =
from r in records
group r by r.Key into grs
let ms = grs.ToLookup(gr => gr.Month, gr => gr.Value)
select new
{
grs.Key,
Months =
from m in months
select ms[m].Sum(),
};
答案 1 :(得分:0)
我不确定如何直接在Linq中执行此操作,但一种方法是执行以下操作:
var keys = myData.Select(d => d.Key).Distinct();
)Dictionary<String, Dictionary<String, Int32>>
- 这会将您的密钥作为第一个字典的键,而将月份作为第二个字典的键答案 2 :(得分:0)
这里提供了非常有趣的解决方案
https://blogs.msdn.microsoft.com/mitsu/2007/12/21/playing-with-linq-grouping-groupbymany/
它描述了如何通过几个属性执行groupbby。即:
var result = customers.GroupByMany(c => c.Country, c => c.City);