2012-08-09 27 views
12

Tôi có biểu hiện LINQ sau:biệt() không hoạt động

AgentsFilter = new BindableCollection<NameValueGuid>((
    from firstEntry in FirstEntries 
    select new NameValueGuid { 
     Name = firstEntry.Agent, 
     Value = firstEntry.AgentId 
    }).Distinct() 
); 

Nhưng vì một số lý do, bộ sưu tập AgentsFilter là đầy đủ của bản sao. Có gì sai với Distinct() của tôi?

Trả lời

28

Distinct sẽ sử dụng phương pháp Equals trên NameValueGuid để tìm các từ khóa trùng lặp. NẾU bạn không ghi đè Equals, thì nó sẽ kiểm tra các tham chiếu.

Bạn có thể thêm bước bổ sung để tránh ghi đè Bằng, bằng cách sử dụng loại ẩn danh. Các kiểu ẩn danh tự động ghi đè Equals và GetHashCode để so sánh từng thành viên. Làm khác biệt về loại ẩn danh, sau đó chiếu lên lớp của bạn sẽ giải quyết được vấn đề.

from firstEntry in FirstEntries 
select new 
{ 
    Name = firstEntry.Agent, 
    Value = firstEntry.AgentId 
}).Distinct().Select(x => new NameValueGuid 
{ 
    Name = x.Name, 
    Value = x.Value 
}); 
+0

Cảm ơn mọi người đã trả lời. –

+1

Bình chọn cho 'Distinct sẽ sử dụng phương thức Equals để tìm các bản sao. Nếu bạn không ghi đè Equals, thì nó sẽ kiểm tra tham chiếu '. –

7

Bạn có thể không đã cung cấp một thực hiện của cả hai GetHashCodeEquals trên NameValueGuid.

Hoặc, nếu không thể, bạn có thể chuyển một phiên bản IEqualityComparer<NameValueGuid> đến cuộc gọi Distinct.

Xem: http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx

+0

Giải thích tốt, nhưng có một giải pháp khác: sử dụng các kiểu ẩn danh (xem câu trả lời của * Cadrell0 *) –

+0

+1, Không nhận ra rằng tôi cần ghi đè 'GetHashCode' để' Distinct' hoạt động. Sau khi ghi đè nó, nó xuất hiện rằng 'Distinct' đầu tiên gọi' GetHashCode' để xác định xem nó cần phải gọi 'Equals'. – DCShannon

4

Bạn cần phải xác định những gì Distinct nghĩa trong bối cảnh một lớp học với NameValue tài sản. Xem MSDN.

Hãy thử quá tải của Phân biệt cho phép bạn cung cấp so sánh.

Ví dụ:

AgentsFilter = new BindableCollection<NameValueGuid>((from firstEntry in FirstEntries 
    select new NameValueGuid 
    { 
     Name = firstEntry.Agent, 
     Value = firstEntry.AgentId 
    }) 
    .Distinct((nvg) => nvg.Value) 
); 

Ngoài ra, nếu bạn có quyền truy cập vào các định nghĩa quy tắc ứng NameValueGuid, sau đó bạn có thể ghi đè GetHashCodeEquals như thích hợp cho lớp. Một lần nữa, hãy xem MSDN

4
select new 
{ 
    Name = firstEntry.Agent, 
    Value = firstEntry.AgentId 
}) 
.Distinct() 
.Select(x => new NameValueGuid 
{ 
    Name = x.Name, 
    Value = x.Value 
}); 
Các vấn đề liên quan