2014-02-09 62 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();