2014-04-30 31 views
0

我有一個數據庫的結果集,我按摩一下,最後存儲在一個列表中。 在這個列表中,結果會是這個樣子:通過Linq尋找一個集合中的不匹配的項目

Field 1: ID1 
Field 2: ID2 
Summary: AA 
Value: 15 

Field 1: ID3 
Field 2: ID2 
Summary: AA 
Value 20 

Field 1: ID1 
Field 2: ID4 
Summary: AA 
Value 25 

Field 1: ID1 
Field 2: ID4 
Summary: AA 
Value 5 

Field 1: ID1 
Field 2: ID4 
Summary: AB 
Value 5 

如果你看它從另一個角度來看,它看起來像一個網格:

  ID2 ID4 
ID1: AA 15 30 
ID1: AB   5 
ID3: AA 20 

所有值可以組合在一起(例如:ID4,ID1,摘要AA)加在一起。 我需要做的是將0值應用於相交中不存在的數據。所以ID2/ID1/AB不存在。我需要在我的列表中有一個項目來表示「存在」,但值爲零。
所有幫助表示讚賞。

+0

你有你的Visual Studio中的一些代碼?請將它粘貼在這裏 –

+0

可能是空合併運算符的情況:?? http://msdn.microsoft.com/zh-CN/library/ms173224.aspx –

回答

1
var items = new [] { 
    new { F1 = "ID1", F2 = "ID2", S = "AA", V = 15 }, 
    new { F1 = "ID3", F2 = "ID2", S = "AA", V = 20 }, 
    new { F1 = "ID1", F2 = "ID4", S = "AA", V = 25 }, 
    new { F1 = "ID1", F2 = "ID4", S = "AA", V = 5 }, 
    new { F1 = "ID1", F2 = "ID4", S = "AB", V = 5 }, 
}; 

var f2s = items.Select(i => i.F2).Distinct(); 

var table = 
    from i in items 
    group i by new { i.F1, i.S } into g 
    select new 
    { 
     g.Key, 
     V = 
      from f in f2s 
      join x in g on f equals x.F2 into ps 
      from p in ps.DefaultIfEmpty() 
      select new { F = f, V = p != null ? p.V : 0 } into w 
      group w by w.F into h 
      select new { h.Key, V = h.Sum(c => c.V) } 
    }; 
+0

太棒了。謝謝。 – furiousgreg

+0

爲什麼.DefaultIfEmpty()?如果不傳遞參數似乎是多餘的...或者我錯過了一個用例? – Flater

+0

@Flater是的,他仍然想明確地看到0,沒有你會想念他們。在Linqpad中測試它,你會看到不同之處。 'DefaultIfEmpty'不僅僅是決定什麼是默認值,它實際上是爲'缺少的項目'生成數據(默認值的形式,在這種情況下是'null')。 – Wasp

相關問題