2010-01-17 33 views
8

Có thể nhận các phần tử riêng biệt của List dựa trên thuộc tính của đối tượng trong số List không?LINQ Phân biệt dựa trên tài sản của đối tượng

someting như: Distinct(x => x.id)

Có gì không hữu ích đối với tôi là như sau: .Select(x => x.id).Distinct() vì sau đó tôi sẽ lấy lại một List<int> thay vì List<MyClass>

+0

Gần giống như: http://stackoverflow.com/questions/520030/why-is-there-no-linq-method-to-return-distinct-values-by-a-predicate –

Trả lời

2

Bạn cần DistinctBy. Nó không phải là một phần của thư viện .NET chuẩn, nhưng Jon Skeet đã thực hiện nó cho LINQ đối tượng here. Nó cũng được bao gồm trong morelinq.

6

Đó có vẻ là một nhóm xây dựng đối với tôi, bởi vì bạn cần phải quyết định của đối tượng được cho là giống hệt bạn thực sự muốn trở lại

var q = from x in foo 
     group x by x.Id into g 
     select g.First(); // or some other selection from g 

Chỉ vì Id là giống hệt nhau trên nhiều mặt hàng không có nghĩa là các các mục giống hệt nhau trên các thuộc tính khác, vì vậy bạn cần phải quyết định rõ ràng mục nào được trả về.

5

Những gì bạn có thể làm là thực hiện riêng IEqualityComparer<T> của bạn và thông qua đó để Distinct:

class SomeType { 
    public int id { get; set; } 
    // other properties 
} 
class EqualityComparer : IEqualityComparer<SomeType> { 
    public bool Equals(SomeType x, SomeType y) { 
     return x.id == y.id; 
    } 

    public int GetHashCode(SomeType obj) { 
     return obj.id.GetHashCode(); 
    } 
} 

Sau đó:

// elements is IEnumerable<SomeType> 
var distinct = elements.Distinct(new EqualityComparer()); 
// distinct is IEnumerable<SomeType> and contains distinct items from elements 
// as per EqualityComparer 
2

Có một tình trạng quá tải trên Enumerable.Distinct() rằng mất IEqualityComparer.

Dưới đây là một ví dụ mà tôi sử dụng nó để lọc số nguyên bằng chẵn lẻ:

class IntParitiyComparer : IEqualityComparer<int> 
    { 
     public bool Equals(int x, int y) 
     { 
      return x % 2 == y % 2; 
     } 

     public int GetHashCode(int obj) 
     { 
      return obj % 2; 
     } 
    } 

    static void Main(string[] args) 
    { 
     var x = new int[] { 1, 2, 3, 4 }.Distinct(new IntParitiyComparer()); 

     foreach (var y in x) Console.WriteLine(y); 
    } 

Đó là vụng về; DistinctBy sẽ sạch hơn.

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