2009-07-21 187 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; 
} 
相關問題