2011-11-02 26 views
5

Ai đó có thể giải thích tại sao dòng sau của C# không hoạt động giống như khối foeach sau đây?IEnumerable Chọn

string [] strs = {"asdf", "asd2", "asdf2"}; 
strs.Select(str => doSomething(str)); 


foreach(string str in strs){ 
    doSomething(str); 
} 

Tôi đặt điểm ngắt bên trong doSomething() và nó không kích hoạt trong Chọn nhưng nó không có mục đích foreach.

TIA

+2

Bạn nên đọc một vài từ đầu tiên của phần nhận xét trong [tài liệu] (http://msdn.microsoft.com/en-us/library/ bb548891.aspx). – ChaosPandion

+0

@ChaosPandion Nhận xét ban đầu của bạn tốt hơn nhiều. ;) – Marc

+0

@Marc - Tôi muốn ngoại giao hơn một chút vì OP có thể không biết phương thức trì hoãn hoặc thực thi có nghĩa là gì. – ChaosPandion

Trả lời

1

Truy vấn Linq sẽ không được xử lý cho đến khi bạn chuyển nó sang một Enumarable sử dụng ToList(), ToArray() vv

Và bằng cách tương đương với tuyên bố foreach của bạn là một cái gì đó như thế này:

strs.ForEach(doSomething);

strs.ToList().ForEach(doSomething); 

hoặc

Array.ForEach(strs, doSomething); 
+0

Tôi giả sử bạn có nghĩa là Array.ForEach (str, DoSomething) – dharga

+0

@dharga, Vâng, tôi thường mắc lỗi khi tôi viết mã mà không cần kiểm tra, phiên bản chính xác sẽ là 'strs.ToList(). ForEach (doSomething); 'hoặc' Array.ForEach (strs, doSomething); ' – fardjad

+0

. Chọn() là lười. Ngoài ra, doSomething() phải trả về một giá trị, như .Select lấy một (a -> b), hoặc trong .NET nói, phải mất một Func <..>, không phải là một hành động <..>. – Daniel

10

Điều này là do truy vấn LINQ được hoãn lại. Lambda được truyền cho phương thức Select được thực thi khi bạn truy cập kết quả.

Hãy thử:

string [] strs = {"asdf", "asd2", "asdf2"}; 
var result = strs.Select(str => doSomething(str)); 

foreach(var item in result) { 
} 
+0

điều duy nhất tôi muốn nói với điều này là tôi thích có một danh sách tĩnh để lặp lại thay vì IEnumerable, nếu bạn có ý định sửa đổi bộ sưu tập trong vòng lặp của bạn. – Gent

0

Tôi nghĩ rằng một khi bạn sử dụng các giá trị trở về từ các lựa chọn bạn sẽ thấy doSomething() được gọi. Hãy xem yield để xem tại sao điều này xảy ra.

1

bạn sẽ cần phải làm điều gì đó như

string [] strs = {"asdf", "asd2", "asdf2"}; 
strs = strs.Select(str => doSomething(str)).ToArray(); 


foreach(string str in strs){ 
    doSomething(str); 
} 
Các vấn đề liên quan