2014-02-09 58 views
0

加入的另一個列表我有一個計數器對象列表和一個增量列表。 有沒有一種方式使用Linq來使用Id中的數據更新計數器列表字段。如何使用Linq更新列表中的字段基於ID

這是一個減少代碼示例。

class Counter 
{ 
    public int Id; 
    public int A; 
    public int B; 
} 

class Delta 
{ 
    public int Id; 
    public int ADelta; 
    public int BDelta; 
} 

IList<Counter> counters = new List<Counter>() 
{ 
    new Counter{Id=1, A=0, B=5}, 
    new Counter{Id=2, A=0, B=0}, 
    new Counter{Id=3, A=5, B=0} 
}; 

IList<Delta> deltas = new List<Delta>() 
{ 
    new Delta(){Id=1, ADelta=5, BDelta = 5}, 
    new Delta(){Id=3, ADelta=0, BDelta = 10} 
}; 

它將通過ID加入和計數器將最終爲:

Counter{Id=1, A=5, B=10} 
Counter{Id=2, A=0, B=0} 
Counter{Id=3, A=5, B=10} 
+0

如果有相應的應對不止一個三角形? –

+0

在完整應用程序中,每個計數器只有一個增量。 – Cogslave

回答

2

的LINQ是用於查詢,不能用於更新現有實例。我建議你創建字典三角洲,然後用簡單的foreach更新現有的櫃檯:

var deltasById = deltas.ToDictionary(d => d.Id); 

foreach (var counter in counters) 
{ 
    Delta delta; 
    if (!deltasById.TryGetValue(counter.Id, out delta)) 
     continue; 

    counter.A += delta.ADelta; 
    counter.B += delta.BDelta; 
} 
0
counters = counters.Select(c => 
            { 
             var delta = deltas.SingleOrDefault(d => d.Id == c.Id); 
             return new Counter 
                { 
                 Id = c.Id, 
                 A = c.A + (delta != null ? delta.ADelta : 0), 
                 B = c.B + (delta != null ? delta.BDelta : 0) 
                }; 
            }).ToList();