2013-02-22 47 views
5

Tôi có một danh sách chứa các đối tượng nhưng những objests này không phải là duy nhất trong danh sách. Tôi viết mã này để tạo duy nhất chúng trong một danh sách khác:List.Contains không hoạt động chính xác

foreach (CategoryProductsResult categoryProductsResult in categoryProductsResults.Where(categoryProductsResult => !resultSet.Contains(categoryProductsResult))) 
{ 
    resultSet.Add(categoryProductsResult); 
} 

Nhưng kết quả cuối cùng là giống với danh mụcSản phẩmResults. hàng thứ hai

categoryProductsResult của:

enter image description here

ResultSet đầu hàng:

enter image description here

Như bạn có thể thấy hàng đầu tiên ResultSet và hàng thứ hai categoryProductsResult là giống nhau nhưng nó bổ sung thêm hàng thứ hai để resultSet.

Bạn có đề xuất nào không?

+1

Hiển thị cho chúng tôi nơi bạn ghi đè '.equals()'. –

Trả lời

12

Contains sử dụng trình so sánh mặc định so sánh tài liệu tham khảo vì lớp học của bạn không ghi đè EqualsGetHashCode.

class CategoryProductsResult 
{ 
    public string Name { get; set; } 
    // ... 

    public override bool Equals(object obj) 
    { 
     if(obj == null)return false; 
     CategoryProductsResult other = obj as CategoryProductsResult; 
     if(other == null)return false; 
     return other.Name == this.Name; 
    } 

    public override int GetHashCode() 
    { 
     return Name.GetHashCode(); 
    } 
} 

Bây giờ bạn chỉ có thể sử dụng:

resultSet = categoryProductsResults.Distinct().ToList(); 
+1

Mã exellent, cảm ơn bạn rất nhiều. – cagin

0

Đối tượng tham chiếu trong danh sách được lập chỉ mục theo mã băm của chúng. Vì vậy, Contains sẽ không bao giờ tìm thấy một đối tượng tài liệu tham khảo với mã băm cùng (trừ khi bạn ghi đè thi GetHashCodeEquals trong lớp.

này SO answer giải thích.

3

Danh sách sử dụng comparer trả về bởi EqualityComparer.Default và theo để tài liệu cho rằng:

các kiểm tra tài sản Mặc dù loại T thực hiện các System.IEquatable (Of T) giao diện, và nếu như vậy, trả về một EqualityComparer (Of T) có sử dụng mà thực hiện. Nếu không, nó trả về một EqualityComparer (Of T) mà sử dụng ghi đè của Object.equals và Object.GetHashCode cung cấp bởi T.

Vì vậy, bạn có thể thực hiện IEquatable trên lớp tùy chỉnh của bạn, hoặc ghi đè lên Equals (và GetHashCode) để so sánh các thuộc tính mà bạn yêu cầu. Hoặc bạn có thể sử dụng linq:

bool contains = list.Any (i => i.Id == obj.Id);

0

Bạn cần phải kiểm tra xem mục hiện tại của bạn được chứa trong danh sách mục tiêu của bạn cho mỗi lần lặp. Hiện tại bạn kiểm tra một lần ở đầu vòng lặp, điều đó có nghĩa là không có mục nào của bạn nằm trong danh sách đích.

Tôi nghĩ rằng Distinct đã làm những gì bạn muốn, bạn có thể muốn sử dụng tiện ích mở rộng này thay vì vòng lặp của riêng bạn.

1

Mỗi categoryProductsResult khác nhau. Nó giống như một cái gì đó bạn có thể thấy here.Nếu bạn muốn đơn giản hơn và ProductId là mã định danh duy nhất của bạn. Chỉ cần thực hiện mã bên dưới:

foreach (CategoryProductsResult categoryProductsResult in categoryProductsResults.Where(categoryProductsResult => resultSet.ProductId !=categoryProductsResult.ProductId) 
{ 
    resultSet.Add(categoryProductsResult); 
} 
Các vấn đề liên quan