Nếu tôi đang cố gắng lọc kết quả ở nhiều cấp độ khác nhau của đồ thị đối tượng IEnumerable<T>
, có cách nào ưu tiên là chuỗi các phương pháp mở rộng để thực hiện việc này không?Cách ưa thích (có thể thực hiện và có thể đọc được) của chuỗi các phương pháp mở rộng IEnumerable <T> là gì?
Tôi đang mở cho bất kỳ phương pháp tiện ích mở rộng nào và sử dụng lambda, nhưng tôi không muốn sử dụng cú pháp LINQ để duy trì tính nhất quán với phần còn lại của codebase.
Có tốt hơn không khi đẩy bộ lọc đến selector
của phương pháp SelectMany()
hoặc chỉ để kết nối phương thức Where()
khác? Hoặc là có một giải pháp tốt hơn?
Tôi sẽ làm cách nào để xác định tùy chọn tốt nhất? Trong trường hợp thử nghiệm này, mọi thứ đều có sẵn trong bộ nhớ. Rõ ràng cả hai mẫu dưới đây hiện đang sản xuất cùng một kết quả chính xác; Tôi chỉ tìm kiếm một lý do nào đó hoặc một lý do khác (hoặc một tùy chọn khác) sẽ được ưu tiên hơn.
public class Test
{
// I want the first chapter of a book that's exactly 42 pages, written by
// an author whose name is Adams, from a library in London.
public Chapter TestingIEnumerableTExtensionMethods()
{
List<Library> libraries = GetLibraries();
Chapter chapter = libraries
.Where(lib => lib.City == "London")
.SelectMany(lib => lib.Books)
.Where(b => b.Author == "Adams")
.SelectMany(b => b.Chapters)
.First(c => c.NumberOfPages == 42);
Chapter chapter2 = libraries
.Where(lib => lib.City == "London")
.SelectMany(lib => lib.Books.Where(b => b.Author == "Adams"))
.SelectMany(b => b.Chapters.Where(c => c.NumberOfPages == 42))
.First();
}
Và đây là đồ thị đối tượng mẫu:
public class Library
{
public string Name { get; set; }
public string City { get; set; }
public List<Book> Books { get; set; }
}
public class Book
{
public string Name { get; set; }
public string Author { get; set; }
public List<Chapter> Chapters { get; set; }
}
public class Chapter
{
public string Name { get; set; }
public int NumberOfPages { get; set; }
}
Khả năng đọc có vẻ như bằng nhau. Hiệu suất phụ thuộc vào việc đây là linq đối với các đối tượng hay linq với bất kỳ thứ gì khác; tại sao bạn không đo lường nó và xem? – phoog
là các truy vấn của bạn luôn dưới dạng 'thư viện => sách => chương' - hoặc bạn có thể có nhiều mối quan hệ phức tạp hơn (tôi đoán đây chỉ là mô hình thử nghiệm) – NSGaga
@NSGaga Chúng luôn ở dạng thứ bậc, nhưng bạn chính xác rằng đó chỉ là một mô hình thử nghiệm để giúp người đọc dễ hiểu hơn. Về mặt kỹ thuật, tôi đang làm việc với các cấu trúc EDI (ANSI X12), vì vậy các tệp, ISA, GS và các phân đoạn ST. –