簡體   English   中英

使用LINQ的數據透視表式結果

[英]Pivot-table-esque result using LINQ

有沒有一種方法可以在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

我認為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;
            }
        }

可能有多種方法可以使它更具動態性,但這是另一個問題。

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; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM