LINQ从另一个列表更新一个列表

时间:2012-06-19 21:22:56

标签: c# linq

我正在尝试在ConcurrentDictionary中找到更新值的优雅方法。我已经创建了一个快速示例,说明了我在下面尝试实现的目标:

ConcurrentDictionary<int, MyDataClass> dataLookup = new ConcurrentDictionary<int, MyDataClass>();

// Initialise the example dataLookup with some dummy data
new List<MyDataClass>
{
    new MyDataClass { Id = 1, ValueProperty = 0 },
    new MyDataClass { Id = 2, ValueProperty = 0 },
    new MyDataClass { Id = 3, ValueProperty = 0 },
    new MyDataClass { Id = 4, ValueProperty = 0 },
    new MyDataClass { Id = 5, ValueProperty = 0 }               
}.ForEach(myClass => dataLookup.TryAdd (myClass.Id, myClass));

// incoming results that need to be fed into the above dataLookup 
List<MyDataClass> newDataReceived = new List<MyDataClass>
{
    new MyDataClass { Id = 1, ValueProperty = 111 },
    new MyDataClass { Id = 3, ValueProperty = 222 },
    new MyDataClass { Id = 5, ValueProperty = 333 }
};

所以在上面的例子中,我想在dataLookup ConcurrentDictionary中设置ValueProperty,Id为1,3&amp;分别为5至111,222和333。我可以将newDataReceived对象更改为我想要的任何东西,但我几乎坚持使用dataLookup作为ConcurrentDictionary。

目前我正在遍历列表,但我正在寻找一些关于使用LINQ来提高此任务效率的建议。

3 个答案:

答案 0 :(得分:2)

如果它真的只是更新,你可以使用另一个ForEach

newDataReceived.ForEach(x => dataLookup[x.Id].ValueProperty = x.ValueProperty);

我个人只是用一个简单的foreach循环来表达这个:

foreach(var update in newDataReceived)
    dataLookup[update.Id].ValueProperty = update.ValueProperty;

请注意,上面缺少检查该项是否实际包含在并发字典中 - 如果不能保证(它不是更新),则必须添加此项检查。

答案 1 :(得分:1)

只是尝试在Join()中进行更新,并感到惊讶。 您显然必须实现自己的IEqualityComparer,以便仅比较所需的成员,例如ID,密钥或类似成员。

    private static void SaveProcessedFile(IEnumerable<HashedRow> processedRows, IEnumerable<HashedRow> justProcessedRows)
    {
        var comparer = new HashedRowEqualityComparerOrderLine();
        var updated = justProcessedRows.Join(processedRows, n => n, o => o, (n, o) => { o = n; return n; }, comparer); // n - new, o - old
        var inserted = justProcessedRows.Except(updated, comparer);
        // To do something
    }

答案 2 :(得分:0)

Linq用于查询,而不是更新。如果您能够使用Linq的ToDictionary()方法创建新词典,那么因为您必须调用一个方法来添加或多或少地降级到{​​{1}}循环。< / p>

此外,Linq不会做任何更高效的,它只会使代码看起来更自然。