Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#表达式与循环美_C#_While Loop_Expression - Fatal编程技术网

c#表达式与循环美

c#表达式与循环美,c#,while-loop,expression,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) {

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

您不能在表达式中声明变量

你可以写

string line;
while (line = reader.ReadLine() != null)
为了更清楚,我更喜欢写

string line;
while (null != (line = reader.ReadLine()))
然而,最好的选择是

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

}
这将等效执行。
如果您正在阅读其他流,可以创建一个扩展方法,使用前面的语法启用
foreach
循环。

我个人更喜欢:

string line;
while (line = reader.ReadLine() != null)
{
  ...
}
但是,作为替代方案,始终存在for构造:

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

1) 在循环中声明变量,但在条件中赋值:

string line;
while ((line = reader.ReadLine()) != null)
{
}
2) 改为使用for循环:

for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
{
}
3) 创建一个扩展方法,将读取器转换为
IEnumerable
,然后使用:

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

就我个人而言,如果可能的话,我喜欢最后一种形式,否则我会使用第一种形式。

我通常会这样写:

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

我同意重复
reader.ReadLine()
表达式是不好的。一种方法是使用
while(true)
break

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

  //do something with line
}
那么:

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.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);
}
public static IEnumerable NotNull(此为T self,Func yielder)
{
返回self.ToSequence(yielder,(r)=>r!=null);
}

之前不要忘记声明变量。@VladimirPerevalov:我没有。你可以将最后一个变量设置为
var
,不是吗?我的意思是,如果你的同事不能弄清楚
ReadLines
的结果是
string
,那么解决办法不是直接键入,而是立即解雇:-)@JörgWMittag:我可以,但我不确定这样做是否有任何好处。不确定这是否真的能改善美感;)
public static IEnumerable<R> NotNull<T, R>(this T self, Func<T, R> yielder)
{
    return self.ToSequence(yielder, (r) => r != null);
}