在LINQ中有没有办法做到这一点 - 我现在一直在反对这一点:
来源:
var selectedDate = new DateTime(2013, 1, 1);
var selectedMonth = selectedDate.Month;
var selectedYear = selectedDate.Year;
var data = new List<MyClass>
{
new MyClass { Date = new DateTime(2013, 1, 1), Val1 = 1, Val2 = 2 },
new MyClass { Date = new DateTime(2013, 1, 2), Val1 = 1, Val2 = 2 },
new MyClass { Date = new DateTime(2013, 2, 1), Val1 = 1, Val2 = 2 }
};
Date | Val1 | Val2
01/01/2013 | 1 | 2
02/01/2013 | 1 | 2
01/02/2013 | 1 | 2
结果(每个Val
与日期/月/年的总和):
| selectedDate | selectedMonth | selectedYear
Val1 | 1 | 2 | 3
Val2 | 2 | 4 | 6
答案 0 :(得分:1)
我认为LINQ不是解决方案。你可以很容易地获得一个旋转的“行”,但你需要再次枚举序列以获得下一个序列,这不是非常有效(如果源是一个“懒惰”可枚举而且你不会我想把整个序列保存在内存中。)
我认为最简单,最有效的解决方案是标准foreach
。如果必须的话,可以使用Aggregate将其转换为LINQ,但它不会那么简单:
var val1 = new Result();
var val2 = new Result();
foreach (var item in data) {
if (item.Date == selectedDate) {
val1.Date += item.Val1;
val2.Date += item.Val2;
}
if (item.Date.Month == selectedMonth) {
val1.Month += item.Val1;
val2.Month += item.Val2;
}
if (item.Date.Year == selectedYear) {
val1.Year += item.Val1;
val2.Year += item.Val2;
}
}
可能有些方法可以使这更具活力,但这是另一个问题。
答案 1 :(得分:0)
var result = new List<Result>{
new Result{
Val = "Val1",
Date = data.Sum(e => e.Val1 * (e.Date == selectedDate ? 1 : 0)),
Month = data.Sum(e => e.Val1 * (e.Date.Month == selectedMonth ? 1 : 0)),
Year = data.Sum(e => e.Val1 * (e.Date.Year == selectedYear ? 1 : 0)),
},
new Result{
Val = "Val2",
Date = data.Sum(e => e.Val2 * (e.Date == selectedDate ? 1 : 0)),
Month = data.Sum(e => e.Val2 * (e.Date.Month == selectedMonth ? 1 : 0)),
Year = data.Sum(e => e.Val2 * (e.Date.Year == selectedYear ? 1 : 0)),
}
};
使用Result
:
public class Result {
public String Val { get; set; }
public int Date { get; set; }
public int Month { get; set; }
public int Year { get; set; }
}