Sau nhiều thử nghiệm tìm kiếm và mã của Google, tôi đã gặp phải vấn đề phức tạp về C# LINQ-to-objects trong SQL có thể dễ dàng giải quyết bằng một cặp hàm ROW_NUMBER() ... PARTITION BY và một truy vấn phụ hoặc hai.Chỉ mục LINQ-to-đối tượng trong một nhóm + cho các nhóm khác nhau (aka ROW_NUMBER với PARTITION BY tương đương)
Dưới đây là, trong lời nói, những gì tôi đang cố gắng để làm trong code-- yêu cầu cơ bản là loại bỏ các văn bản trùng lặp từ một danh sách:
- Đầu tiên, nhóm một danh sách bằng (Document.Title, tài liệu. SourceId), giả định định nghĩa lớp (đã đơn giản hóa) như sau:
class Document { string Title; int SourceId; // sources are prioritized (ID=1 better than ID=2) }
- Trong nhóm đó, chỉ định mỗi tài liệu một chỉ mục (ví dụ: Chỉ mục 0 == Tài liệu thứ nhất với tiêu đề này từ nguồn này, Chỉ mục 1 = Tài liệu thứ 2 với tiêu đề từ nguồn này, v.v.) Tôi rất thích tương đương ROW_NUMBER() trong SQL!
- Bây giờ nhóm theo (Document.Title, Index), trong đó chỉ số được tính ở bướC# 2. Đối với mỗi nhóm, chỉ trả về một tài liệu: một tài liệu có Document.SourceId thấp nhất.
BướC# 1 rất dễ dàng (ví dụ codepronet.blogspot.com/2009/01/group-by-in-linq.html), nhưng tôi bị bối rối về các bướC# 2 và # 3. Tôi dường như không thể xây dựng một truy vấn C# LINQ màu đỏ-squiggle-miễn phí để giải quyết tất cả ba bước.
Bài đăng của Anders Heilsberg trên this thread là tôi nghĩ câu trả lời cho các bướC# 2 và # 3 ở trên nếu tôi có thể nhận được cú pháp đúng.
Tôi muốn tránh sử dụng biến cục bộ bên ngoài để thực hiện tính toán Chỉ mục, như được đề xuất trên slodge.blogspot.com/2009/01/adding-row-number-using-linq-to-objects.html, kể từ khi giải pháp đó phá vỡ nếu biến bên ngoài được sửa đổi. Tối ưu, bước theo từng nhóm có thể được thực hiện trước, vì vậy nhóm "bên trong" (đầu tiên theo Nguồn để tính toán chỉ mục, sau đó theo Chỉ mục để lọc ra các bản sao) có thể hoạt động trên một số lượng nhỏ các đối tượng trong mỗi nhóm "theo tiêu đề" nhóm, vì số lượng tài liệu trong mỗi nhóm tiêu đề thường dưới 100. Tôi thực sự không muốn một giải pháp N !
Tôi chắc chắn có thể giải quyết vấn đề này với vòng lặp forested lồng nhau, nhưng có vẻ như đó là loại sự cố đơn giản với LINQ.
Bất kỳ ý tưởng nào?
Hey DahlbyK - điều này thật tuyệt! Giải pháp của bạn có vẻ tốt. Bây giờ tôi không cảm thấy xấu về việc không thể tự mình tìm ra nó lần đầu tiên. Tôi phát hiện ra quá tải Select-with-index nhưng không thể tìm ra cách để đưa nó vào một truy vấn LINQ. Một số mã đai đen cuối cùng của bạn, nhờ sự giúp đỡ và giáo dục trong những gì có thể. –