2009-07-21 10 views
16

私は私が何をしたいのかIQueryable<someClass> baseListLinqは別のコレクションの値でコレクションを更新しますか?

List<someOtherClass> someDataが

を持っているが、更新がbaseListでいくつかの項目の属性です。

someDataのすべてのアイテムについて、対応するアイテムをベースリストに登録し、そのアイテムのプロパティを更新したいと考えています。

someOtherClass.someCode == baseList.myCode

私はLINQをして参加し、baseList.someData + = someOtherClass.DataIWantToConcantenateを設定するいくつかの種類を行うことができます。

私はおそらく繰り返しでこれを行うことができましたが、ちょうど2行のコードでこれを行うことができる素晴らしいLinqの方法はありますか?サンディエゴの任意のヒントについて

おかげで、 〜CK

答えて

19

を:

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のUNION、INTERSECTで、またはメソッドを除いて見てみましょう。

+0

これは私のためにうまくいった。ありがとうございました! – Hcabnettek

+0

大変ありがとうございます! – PramodChoudhari

12

LINQはを照会ためである - ない更新に。つまり、LINQを使用して対応するアイテムを見つけることは問題ありませんが、修正のためににはを使用する必要があります。

確かに適切なクエリを実行してbaseListを効率的なフォームにすることをお勧めします。 Dictionary<string, SomeClass>は、対応するアイテムを見つけるために使用するプロパティに基づいています。

3

あなたはIQueryable<SomeClass>は、List<SomeClass>に変換IQueryableに戻って変換した後、その上にループにForEachメソッドを使用して要素を更新することができます

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

それは例えば、このアプローチと受け入れアプローチとの間の交差を行うために働くだろう (from someData )d.someCodeのbaseList.AsEnumerable()内のbをbとbと等しくします。MyCode 新しい{b、d}を選択)ToList.ForEach(a => { a.b.SomeData + = a.d.DataIWantToConcatenate; }); – stevenrcfox

0

2つの異なるタイプであるため、1つのリストに含まれているオブジェクトだけを検索することはできません。 2つの異なるクラスに共通するOtherPropertyというプロパティを比較し、同じタイプを共有していると仮定します。その場合には、LINQクエリは何も使用していない:あなたが参加LINQを使用できる2つのリスト内の要素をペアリングするには

// 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; 
} 
関連する問題