Tôi biết IEnumerable đã được thảo luận nhiều lần ở đây nhưng tôi không thể tìm thấy câu trả lời cho câu hỏi cụ thể của tôi vì vậy tôi đưa nó lên như một câu hỏi mới.Nhiều điều tra của IEnumerable
Hãy xem xét các đoạn mã sau:
static void Main(string[] args)
{
List<string> testList = new List<string> {"Test", "Test1", "Test1"};
IEnumerable<string> filtered = testList.Where(x => x == "Test1");
DoSomeWork(filtered);
DoSomeMoreWork(filtered);
}
public static void DoSomeWork(IEnumerable<string> items)
{
foreach (var item in items)
{
Console.WriteLine("do some work");
}
}
public static void DoSomeMoreWork(IEnumerable<string> items)
{
foreach (var item in items)
{
Console.WriteLine("do some more work");
}
}
Tôi có phải không, mà điều này gây ra không chỉ có hai mục trong "lọc" để lặp hai lần nhưng thực sự các mục trong "testList"? Vì vậy, xem xét rằng "testList" là một danh sách lớn với 10000 mục và "lọc" làm giảm nó thành 10 mục, nó sẽ thông minh hơn để làm cho "lọc" một danh sách (aka var sử dụng và chỉ cần thêm ToList() ở cuối)
EDIT: Đó là câu hỏi đáng xấu hổ nhất mà tôi từng hỏi ở đây. Tôi biết nó sẽ là xấu để lặp lại một IQueryable ví dụ bởi vì điều này sẽ dẫn đến việc lấy dữ liệu hai lần từ DB. Tuy nhiên tôi đã không chắc chắn chính xác về trong danh sách bộ nhớ. Tôi sẽ xóa các câu hỏi nếu tôi có thể ;-)
Vâng, tôi biết điều đó. Nhưng câu hỏi là.DoSomeWork() và DoSomeMoreWork() có gây ra lặp lại danh sách lớn hay không, chúng sẽ chỉ lặp lại tập hợp con. – Christoph
@Christoph - câu trả lời được chỉnh sửa ngay bây giờ ..... –
Tốt hơn để sử dụng .ToArray rằng ToList để sử dụng này: mảng là phần nào hiệu quả hơn, nhưng quan trọng nhất, chúng không cho phép thêm/loại bỏ, tránh tính linh hoạt không cần thiết (do đó tránh nhầm lẫn và lỗi). –