2011-11-24 22 views
2

這可能是非常主觀的,但是當控制變量在循環中更新時,人們通常如何在C#中展示它們的循環控制?我的學生不喜歡單獨的聲明和重複。例如。c#表達式和循環美

string line = reader.ReadLine(); 
while (line != null) 
{ 
    //do something with line 

    line = reader.ReadLine(); 
} 

在我的C編碼器要改變這

while (string line = reader.ReadLine() != null) 
{ 
    //do something with line 
} 

但C#的表情似乎不工作方式:(

回答

4

你不能聲明內的一個變量表達。

你可以寫

string line; 
while (line = reader.ReadLine() != null) 

使其更清晰,我喜歡寫

string line; 
while (null != (line = reader.ReadLine())) 

然而,最好的選擇是

foreach(string line in File.ReadLines(path) { 

} 

這將等效執行。
如果您正在閱讀其他流,則可以創建一個擴展方法,使用以前的語法啓用foreach循環。

+0

並且不要忘記在之前聲明變量。 –

+1

@VladimirPerevalov:我沒有。 – SLaks

2

就個人而言,我更喜歡:

string line; 
while (line = reader.ReadLine() != null) 
{ 
    ... 
} 

總是有用於構造如同一個選擇:

for (string line = reader.ReadLine(); line != null; line = reader.ReadLine()) 
{ 
    ... 
} 
7

選項:

1)聲明變量的循環,但其分配在該條件下:

string line; 
while ((line = reader.ReadLine()) != null) 
{ 
} 

2)使用一個for循環,而不是:

for (string line = reader.ReadLine(); line != null; line = reader.ReadLine()) 
{ 
} 

3)創建一個擴展方法把一個閱讀器插入到IEnumerable<String>,然後使用:

foreach (string line in reader.ReadLines()) 
{ 
} 

個人而言,我喜歡最後一個在可能的情況 - 否則我會使用第一種形式。

+0

你可以讓最後一個'var',不是?我的意思是,如果你的同事不能明白'ReadLines'的結果是'string',那麼解決方案並不是明確的輸入,而是立即解僱:-) –

+1

@JörgWMittag:我可以,但我不確定是否有任何好處在這樣做。 –

1

我平時寫的東西,如:

string line; 
while((line = reader.ReadLine()) != null) 
{ 
} 
0

我同意重複reader.ReadLine()表現並不好。一種方法是使用while(true)break

while(true) 
{ 
    string line = reader.ReadLine(); 
    if(line == null) 
    break; 

    //do something with line 
} 
0

如何:

public static IEnumerable<R> ToSequence<T, R>(this T self, 
    Func<T, R> yielder, Func<R, bool> condition) 
{ 
    R result = yielder(self, R); 
    while (condition(result)) 
    { 
     yield return result; 
    } 
} 

,然後用它是這樣的:

foreach (var line in reader.ToSequence(
    (r) => r.ReadLine(), 
    (line) => line != null)) 
{ 
    // do some stuff to line 
} 

,或者你寧願:

foreach (var line in reader.NotNull(r => r.ReadLine())) 
{ 
    // do some stuff to line... 
} 

可以定義爲:

public static IEnumerable<R> NotNull<T, R>(this T self, Func<T, R> yielder) 
{ 
    return self.ToSequence(yielder, (r) => r != null); 
} 
+0

不確定真的會改善美觀;) – GazTheDestroyer