2009-07-21 110 views
16

IQueryable<someClass> baseListLinq使用另一个集合中的值更新集合?

List<someOtherClass> someData

我想要做的就是在baseList一些项目更新属性。

对于someData中的每个项目,我想在baselist中找到相应的项目并更新项目的属性。

someOtherClass.someCode == baseList.myCode

我可以做一些类型的LINQ加入,并设置baseList.someData + = someOtherClass.DataIWantToConcantenate的。

我可以通过迭代来做到这一点,但有一种奇特的Linq方式,我可以在几行代码中做到这一点?

感谢您的任何提示, 〜CK在圣地亚哥

回答

19

要对元素的两个列表,你可以使用LINQ加入:

var pairs = from d in someData 
      join b in baseList.AsEnumerable() 
       on d.someCode equals b.myCode 
      select new { b, d }; 

这会给你每一个项目的枚举someData配对与其对应的baseList。从那里,你可以在一个循环串联:

foreach(var pair in pairs) 
    pair.b.SomeData += pair.d.DataIWantToConcantenate; 

如果你真的意味着一套级联,而不是+=,看看LINQ的联盟,相交或除的方法。

+0

这对我很好。谢谢! – Hcabnettek 2009-07-21 19:51:43

12

LINQ是查询 - 不更新。这意味着使用LINQ来查找相应的项目会很好,但对于应该使用迭代的修改应该是

无可否认,您可能需要执行一些适当的查询,以便首先将baseList转换为高效的形式 - 例如,一个Dictionary<string, SomeClass>根据您将使用的财产找到相应的项目。

3

您可以将IQueryable<SomeClass>转换成List<SomeClass>,使用ForEach方法来遍历它和更新的元素,然后将其转换回IQueryable

List<SomeClass> convertedList = baseList.ToList(); 
convertedList.ForEach(sc => 
{ 
    SomeOtherClass oc = someData.First(obj => obj.SomeCode == sc.MyCode); 
    if (oc != null) 
    { 
     sc.SomeData += oc.DataIWantToConcatenate; 
    } 
}); 

baseList = convertedList.AsQueryable(); // back to IQueryable 

但它可能使用非此期间更有效LINQ构造。

+0

它将工作做到这一点的方法和接受的方法,例如之间的交叉 (来自someData中的d) 在d.someCode中的baseList.AsEnumerable()中加入b等于b。myCode select new {b,d})。ToList.ForEach(a => { a.b.SomeData + = a.d.DataIWantToConcatenate; }); – stevenrcfox 2011-11-02 15:48:23

0

您不能简单地找到一个列表中但不是另一个列表中的对象,因为它们是两种不同的类型。我假设你正在比较一个名为OtherProperty的属性,它是两个不同类共有的属性,并且共享相同的类型。在这种情况下,用什么,但LINQ查询:

// update those items that match by creating a new item with an 
// updated property 
var updated = 
    from d in data 
    join b in baseList on d.OtherProperty equals b.OtherProperty 
    select new MyType() 
    { 
     PropertyToUpdate = d.PropertyToUpdate, 
     OtherProperty = d.OtherProperty 
    }; 

// and now add to that all the items in baseList that weren't found in data 
var result = 
    (from b in baseList 
    where !updated.Select(x => x.OtherProperty).Contains(b.OtherProperty) 
    select b).Concat(updated); 
2

如前所述,它应该是环和LINQ的组合

foreach (var someDataItem in someData) 
{ 
    someDataItem.PropertyToUpdate = (baseList.FirstOrDefault(baseListItem => baseListItem .key == someDataItem.key) ?? new SomeClass(){OtherProperty = "OptionalDefaultValue"}).OtherProperty; 
} 
相关问题