2010-10-14 65 views
18

Nếu tôi có một vòng lặp for như sau:Liệu vòng lặp foreach này có gọi là Split() mỗi lần lặp trong C# không?

foreach(string email in installerEmails.Split(',')) 
{ 
    Console.WriteLine(email); 
} 

sẽ Split() gọi được thực hiện trên mỗi lần lặp của vòng lặp? Tôi có cần lưu trữ nó trong một mảng tạm thời trước khi lặp qua nó không?

+3

+1: câu hỏi hay –

+1

bản sao có thể có của [Cách thức hoạt động của foreach khi lặp qua kết quả hàm?] (Http://stackoverflow.com/questions/1632810/how-does-foreach-work-when-looping-through -function-results) –

Trả lời

26

No. Nó sẽ lặp lại kết quả của cuộc gọi đó, tức là kiểu trả về là Split là mảng chuỗi: string[].

1

Split sẽ được gọi một lần, dẫn đến một mảng. Sau đó, foreach sử dụng một điều tra viên duy nhất để lặp qua mảng.

+4

Tối ưu hóa nó từ cái gì? Đó là những gì đang xác định vòng lặp ở nơi đầu tiên. –

+0

@Jon Hanna: Sai lầm của tôi, tôi đã suy nghĩ trong bối cảnh của một vòng lặp trong một giây. Nó sẽ không tối ưu hóa bất cứ điều gì ở đó, mà sẽ đánh bại mục đích của 'while' :) Tôi đã gỡ bỏ nó từ câu trả lời của tôi, cảm ơn. –

4

No. Chỉ cần gỡ lỗi mã của bạn. bạn sẽ thấy phương thức Split() chỉ được gọi một lần.

0

No. .Split() trả về một IEnumerable và sẽ được sử dụng để lặp lại.

5

Kết quả phân tách được đánh giá một lần, sau đó GetEnumerator() được gọi trên đó. Điều này trả về một IEnumerator mà phương thức MoveNext và thuộc tính Current được gọi trong mỗi lần lặp.

Đó là về cơ bản tương đương với:

string[] enumerable=installerEmails.Split(','); 
IEnumerator<string> enumerator=enumerable.GetEnumerator(); 
while(enumerator.MoveNext()) 
{ 
    string email=(string)enumerator.Current; 
    Console.WriteLine(email); 
} 

Một chi tiết xấu xí là diễn viên rõ ràng để loại bạn đưa ra trong vòng lặp for trình biên dịch tạo ra. Điều này rất hữu ích trong C# 1.0 nơi IEnumerator không phải là chung chung.

Tôi quên rằng Điều tra viên bị xử lý. Xem câu trả lời của Jon Hanna cho mã bao gồm vứt bỏ.

3

Không. Đối tượng được trả về bởi Split (có thể là một mảng, nhưng cùng áp dụng cho các đối tượng khác) là những gì định nghĩa vòng lặp sau khi tất cả. Nếu nó có số không hoặc một triệu mục, đó là nó xác định số không hoặc hàng triệu lần lặp lại, mà nó không thể thực hiện nếu nó vẫn được gọi.

Đối với một chi tiết chút, mã sản xuất trở nên tương đương với:

string[] temp = installerEmails.Split(','); 
var enumerator = temp.GetEnumerator(); 
try 
{ 
    while(enumerator.MoveNext()) 
    { 
    string email = (string)enumerator.Current; 
    Console.WriteLine(email); 
    } 
} 
finally 
{ 
    if(enumerator is IDisposable) 
    ((IDisposable)enumerator).Dispose() 
} 

Như bạn thấy, .Split() được gọi là chỉ một lần.

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