QUAN TRỌNG: Đây là KHÔNG LINQ-TO-SQL CÂU HỎI. Đây là LINQ đối tượng.Bạn có thể tạo đơn giản 'EqualityComparer <T>' bằng cách sử dụng biểu thức lambda
câu hỏi ngắn:
Có một cách đơn giản trong LINQ to đối tượng để có được một danh sách riêng biệt của đối tượng từ một danh sách dựa trên một tài sản quan trọng trên các đối tượng.
câu hỏi Long:
Tôi cố gắng để làm một hoạt động Distinct()
vào một danh sách các đối tượng có một chìa khóa là một trong những tài sản của họ.
class GalleryImage {
public int Key { get;set; }
public string Caption { get;set; }
public string Filename { get; set; }
public string[] Tags {g et; set; }
}
Tôi có danh sách Gallery
đối tượng có chứa GalleryImage[]
.
Do cách hoạt động của webservice [sic] Tôi có các đối tượng địa lý GalleryImage
. tôi nghĩ rằng nó sẽ là một vấn đề đơn giản để sử dụng Distinct()
để có được một danh sách riêng biệt.
Đây là truy vấn LINQ Tôi muốn sử dụng:
var allImages = Galleries.SelectMany(x => x.Images);
var distinctImages = allImages.Distinct<GalleryImage>(new
EqualityComparer<GalleryImage>((a, b) => a.id == b.id));
Vấn đề là EqualityComparer
là một lớp trừu tượng.
Tôi không muốn:
- thực hiện IEquatable trên
GalleryImage
bởi vì nó được tạo ra - phải viết một lớp riêng biệt để thực hiện
IEqualityComparer
như shown here
Có một thực hiện cụ thể của EqualityComparer
một nơi nào đó mà tôi đang mất tích?
Tôi đã nghĩ rằng sẽ có một cách dễ dàng để có được các đối tượng 'khác biệt' từ một tập hợp dựa trên khóa.
Thông tin tuyệt vời! Cảm ơn! –
Điểm của phương thức Create tĩnh thứ hai với tham số 'TSource ignore' là gì? public static ProjectionEqualityComparer Tạo (TSource bị bỏ qua, Func phép chiếu) { trả về ProjectionEqualityComparer (chiếu); } –
flesh
@flesh: Nó cho phép suy luận kiểu để khởi động khi bạn không thể chỉ định loại rõ ràng - ví dụ: cho các loại ẩn danh. –