2011-11-02 21 views
5

Hãy nói tôi cóCó chọn Tiếp theo là Kết quả trong hai lần lặp qua IEnumerable không?

IEnumerable<int> list = new int[] { 1, 2, 3 }; 
List<int> filtered = list.Select(item => item * 10).Where(item => item < 20).ToList(); 

Câu hỏi đặt ra là có hai lần lặp hoặc chỉ là một.

Nói cách khác, đó là tương đương về hiệu suất với:

IEnumerable<int> list = new int[] { 1, 2, 3 }; 
List<int> filtered = new List<int>(); 
foreach(int item in list) { 
    int newItem = item * 10; 
    if(newItem < 20) 
     filtered.Add(newItem); 
} 

Trả lời

7

Có một sự lặp lại duy nhất trên bộ sưu tập thực hiện khi bạn gọi phương thức .ToArray vì vậy cả hai nên tương đương. .Select là một phép chiếu và .Where là một bộ lọc, cả hai được thể hiện dưới dạng các cây biểu thức trên tập dữ liệu gốc.

thể dễ dàng chứng minh:

public class Foo: IEnumerable<int> 
{ 
    public IEnumerator<int> GetEnumerator() 
    { 
     yield return 1; 
     Console.WriteLine("we are at element 1"); 
     yield return 2; 
     Console.WriteLine("we are at element 2"); 
     yield return 3; 
     Console.WriteLine("we are at element 3"); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     var filtered = new Foo() 
      .Select(item => item * 10) 
      .Where(item => item < 20) 
      .ToList(); 
    } 
} 

khi in chạy như sau:

we are at element 1 
we are at element 2 
we are at element 3 
+0

Một nitpick nhỏ: Câu hỏi được gắn thẻ "linq-to-objects" do đó không có cây biểu thức nào liên quan, chỉ lặp đi lặp lại đơn giản thông qua chuỗi cùng với các lời mời ủy nhiệm. – LukeH

2

Trong LINQ to Objects WHERE và CHỌN không lặp qua đếm được. Mã gọi điện thoại liệt kê nó khi nó thực hiện việc tìm kiếm trên truy vấn hoặc ToList hoặc ToArray(), v.v.

Trong LINQ to SQL không có sự lặp lại nào. Khi bạn làm ToList hoặc ToArray() truy vấn được thực hiện bởi cơ sở dữ liệu. Tùy thuộc vào loại truy vấn db có thể tra cứu các chỉ mục hoặc thực hiện quét bảng.

Các vấn đề liên quan