c#表达和循环美

时间:2011-11-24 14:04:28

标签: c# while-loop expression

这可能是非常主观的,但是当循环中更新控制变量时,人们通常如何在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#的表达似乎不是这样的:(

6 个答案:

答案 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);
}