这可能是非常主观的,但是当循环中更新控制变量时,人们通常如何在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#的表达似乎不是这样的:(
答案 0 :(得分: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())
{
}
我个人喜欢最后一个 - 否则我会使用第一个表格。
答案 1 :(得分:4)
您无法在表达式中声明变量。
你可以写
string line;
while (line = reader.ReadLine() != null)
为了更清楚,我更喜欢写
string line;
while (null != (line = reader.ReadLine()))
然而,最好的选择是
foreach(string line in File.ReadLines(path) {
}
这将同等地执行
如果您正在阅读其他一些流,则可以创建一个使用以前语法启用foreach
循环的扩展方法。
答案 2 :(得分:2)
就个人而言,我更喜欢:
string line;
while (line = reader.ReadLine() != null)
{
...
}
尽管如此,仍然有for构造作为替代:
for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
{
...
}
答案 3 :(得分:1)
我经常写一些类似的东西:
string line;
while((line = reader.ReadLine()) != null)
{
}
答案 4 :(得分:0)
我同意重复reader.ReadLine()
表达并不好。一种方法是使用while(true)
和break
:
while(true)
{
string line = reader.ReadLine();
if(line == null)
break;
//do something with line
}
答案 5 :(得分: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);
}