2009-07-21 33 views
16

Tôi có IQueryable<someClass> baseListLINQ để cập nhật bộ sưu tập với các giá trị từ một bộ sưu tập khác?

List<someOtherClass> someData

Những gì tôi muốn làm là cập nhật các thuộc tính trong một số mặt hàng trong baseList.

Đối với mỗi mục trong someData, tôi muốn tìm mục tương ứng trong danh sách cơ sở và cập nhật thuộc tính của mục.

someOtherClass.someCode == baseList.myCode

tôi có thể làm một số loại hình tham gia với LINQ và thiết lập baseList.someData + = someOtherClass.DataIWantToConcantenate.

Tôi có thể làm điều này bằng cách lặp lại, nhưng có một cách Linq ưa thích tôi có thể làm điều này chỉ trong một vài dòng mã?

Thanks cho bất kỳ lời khuyên, ~ ck ở San Diego

Trả lời

19

Để ghép các yếu tố trong hai danh sách, bạn có thể sử dụng một LINQ tham gia:

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

này sẽ cung cấp cho bạn một điều tra của từng hạng mục trong someData cặp với đối tác của nó trong baseList. Từ đó, bạn có thể nối trong một vòng lặp:

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

Nếu bạn thực sự có nghĩa là bộ nối chứ không phải +=, hãy nhìn vào LINQ của Union, Intersect hoặc Trừ phương pháp.

+0

Điều này làm việc tuyệt vời cho tôi. Cảm ơn bạn! – Hcabnettek

+0

Cảm ơn tuyệt vời !! – PramodChoudhari

12

LINQ là dành cho truy vấn - không cho cập nhật. Điều đó có nghĩa là sẽ tốt khi sử dụng LINQ để tìm mục tương ứng, nhưng đối với sửa đổi, bạn nên đang sử dụng tính năng lặp lại.

Phải thừa nhận rằng bạn có thể muốn thực hiện một số truy vấn thích hợp để nhận được baseList thành một biểu mẫu hiệu quả trước tiên - ví dụ: a Dictionary<string, SomeClass> dựa trên thuộc tính bạn sẽ sử dụng để tìm mục tương ứng.

3

Bạn có thể chuyển đổi thành một IQueryable<SomeClass>List<SomeClass>, sử dụng phương pháp ForEach để lặp qua nó và cập nhật các yếu tố, sau đó chuyển đổi trở lại 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 

Nhưng nó có thể hiệu quả hơn trong thời gian này sử dụng phi LINQ cấu trúc.

+0

nó sẽ làm việc để làm một sự pha trộn giữa phương pháp này và cách tiếp cận được chấp nhận, ví dụ (từ d trong một số dữ liệu tham gia b trong baseList.AsEnumerable() trên d.someCode bằng b.myCode chọn mới {b, d}). ToList.ForEach (a => { a.b.SomeData + = a.d.DataIWantToConcatenate; }); – stevenrcfox

0

Bạn không thể đơn giản tìm thấy các đối tượng nằm trong một danh sách nhưng không tìm thấy các đối tượng khác vì chúng là hai loại khác nhau. Tôi giả sử bạn đang so sánh một thuộc tính được gọi là OtherProperty phổ biến cho hai lớp khác nhau và chia sẻ cùng một loại. Trong trường hợp đó, sử dụng không có gì nhưng LINQ truy vấn:

// 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

Như đã đề cập trước đó, nó phải là một sự kết hợp của vòng lặp và LINQ

foreach (var someDataItem in someData) 
{ 
    someDataItem.PropertyToUpdate = (baseList.FirstOrDefault(baseListItem => baseListItem .key == someDataItem.key) ?? new SomeClass(){OtherProperty = "OptionalDefaultValue"}).OtherProperty; 
} 
Các vấn đề liên quan