2012-07-12 18 views
8

Tôi có một List loại MyObject với một định nghĩa dưới đây:LINQ Bắt mục độc đáo từ một danh sách trong một danh sách

class MyObject { 
    public string ListName { get; set; } 
    public IEnumerable<OtherObject> ObjectList { get; set;} 
} 

Cho một List loại MyObject, sử dụng LINQ những gì biểu hiện tôi nên sử dụng để có được tất cả các khác biệt OtherObject?

Điều tôi định làm là lặp lại mỗi MyObject và nhận riêng biệt OtherObject từ thuộc tính ObjectList, nhưng sau đó tôi cần phải nhận được sự khác biệt trong danh sách.

Xin lưu ý rằng nếu: MyObject[0].Objectlist[0] == 'ItemA'MyObject[1].Objectlist[0] == 'ItemA' nó sẽ vẫn trả về một trường hợp ItemA. Mã này chỉ là một biểu diễn. Đây không phải là cách tôi truy cập các đối tượng của tôi, bằng cách này.

+0

http://stackoverflow.com/questions/1300088/distinct-with-lambda có thể đây là điều đáng xem. –

Trả lời

10

Bạn có thể đạt được điều này chỉ cần sử dụng logic Set. C# có một thực hiện ngơi thoải mái tại dưới dạng HashSet:

var set = new HashSet<OtherObject>(myObjects.SelectMany(mo => mo.ObjectList)); 

Hoặc nếu bạn thích chậm thực hiện, bạn có thể sử dụng phương pháp LINQ Distinct:

var distinct = myObjects.SelectMany(mo => mo.ObjectList).Distinct(); 
+0

Cảm ơn bạn! Tôi có một đối tượng là một thuộc tính của một đối tượng lớn hơn, đó là trong một danh sách, đó là trong một danh sách. Đã có thể nhận được một danh sách duy nhất bằng cách thực hiện 'data.SelectMany (d => d.Refs) .Chọn (r => r.MyObject) .Distinct()' là cách đơn giản hơn bằng cách sử dụng '.ForEach()'. – jwatts1980

3

Làm thế nào về:

var l = new List<MyObject>(...); 
var unique = l.SelectMany(j => j.ObjectList).Distinct(); 

Bạn có thể sử dụng kỹ thuật này từ Distinct() with lambda? để thay đổi cách bạn quyết định xem một đối tượng có khác biệt với đối tượng khác hay không.

Các vấn đề liên quan