c#表达式与循环美
这可能是相当主观的,但是当控制变量在循环中更新时,人们通常如何在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) {
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);
}