C# 有没有更好的方法在if,else if,else序列中什么都不做
我在foreach循环中执行if,else-if,else序列。在其中一个州,我什么都不想做。看起来有点奇怪,我想知道有没有更好的方法C# 有没有更好的方法在if,else if,else序列中什么都不做,c#,if-statement,C#,If Statement,我在foreach循环中执行if,else-if,else序列。在其中一个州,我什么都不想做。看起来有点奇怪,我想知道有没有更好的方法 foreach (var item in collection) { if (item.Contains("some text")) { removeNext = true; myList.Add(item); } else if (item.ToUpper().Contains("TEXT IN
foreach (var item in collection)
{
if (item.Contains("some text"))
{
removeNext = true;
myList.Add(item);
}
else if (item.ToUpper().Contains("TEXT IN UPPER") | item.Contains("some other text"))
{
// do nada
}
else if (removeNext)
removeNext = false;
else
myList.Add(item);
}
您可以反转条件并将其余代码放入其中 或者,您也可以反转条件以获得
if(!removeNext)
,使代码稍微短了一点,可以说更可读,但也使赋值removeNext=false
可能没有用处,因为它可能已经是false(但这是一个可以忽略的惩罚)
但就我个人而言,我认为您使用的“flat”命令,即不需要的
if
更易于阅读,而带有一行注释的continue
命令将使该块故意没有任何代码,以及原因变得清晰明了。您可以反转该条件并将其余代码放入其中
或者,您也可以反转条件以获得if(!removeNext)
,使代码稍微短了一点,可以说更可读,但也使赋值removeNext=false
可能没有用处,因为它可能已经是false(但这是一个可以忽略的惩罚)
但就我个人而言,我认为您使用的“flat”(平铺)命令,即不需要的
if
,更易于阅读,而continue
命令加上一行注释,将使该块故意没有任何代码,以及原因。编写该逻辑的另一种方法是跟踪当前项是否被删除。然后,您可以将确定是否应删除下一项的逻辑和确定当前项是否保留的逻辑与实际确定是否将当前项添加到myList
的逻辑分开。这样,您的条件清楚地表明其目的是不删除当前项目
foreach (var item in collection)
{
bool removeCurrent = removeNext;
removeNext = false;
if (item.Contains("some text"))
{
removeNext = true;
removeCurrent = false;
}
else if (item.ToUpper().Contains("TEXT IN UPPER") | item.Contains("some other text"))
{
removeCurrent = false;
}
if (!removeCurrent)
myList.Add(item);
}
编写该逻辑的另一种方法是跟踪当前项是否被删除。然后,您可以将确定是否应删除下一项的逻辑和确定当前项是否保留的逻辑与实际确定是否将当前项添加到
myList
的逻辑分开。这样,您的条件清楚地表明其目的是不删除当前项目
foreach (var item in collection)
{
bool removeCurrent = removeNext;
removeNext = false;
if (item.Contains("some text"))
{
removeNext = true;
removeCurrent = false;
}
else if (item.ToUpper().Contains("TEXT IN UPPER") | item.Contains("some other text"))
{
removeCurrent = false;
}
if (!removeCurrent)
myList.Add(item);
}
为了提供另一种可能性,您可以在
Where
语句中包含所有逻辑,并完全避免循环。这利用了一个事实,即赋值返回赋值结果,这允许我们设置removeNext
变量,并确保包括多个“some text”
项,即使它们在集合中彼此相邻
请注意,这种想法更多的是为了好玩,而不是为了现实世界的代码,因为它很难阅读,如果有人试图更新它,它很容易出错:
bool removeNext = false;
var myList = collection.Where(i =>
!(i.ToUpper().Contains("TEXT IN UPPER") || i.Contains("some other text")) &&
(!removeNext | (removeNext = i.Contains("some text"))));
解释
&&
之前的条件会删除我们绝对不关心的所有文本。这基本上是我在你最初的问题下的评论(这本身就是一个很好的预过滤结果的解决方案)。&&
的第二部分内容如下:
“如果removeNext
为false
或者如果赋值的结果removeNext=i.Contains(“某些文本”)
为true
,请选择项目。”
这里的|
是关键,因为即使removeNext
是false
,我们仍然希望执行第二部分中的赋值
我们不使用
|
运算符,因为它是一个,这意味着如果第一部分返回true
,它就不需要计算第二部分(通常我们希望进行此优化),removeNext
值永远不会更改。只是为了给出另一种可能性,您可以在Where
语句中包含所有逻辑,并完全避免循环。这利用了一个事实,即赋值返回赋值结果,这允许我们设置removeNext
变量,并确保包括多个“some text”
项,即使它们在集合中彼此相邻
请注意,这种想法更多的是为了好玩,而不是为了现实世界的代码,因为它很难阅读,如果有人试图更新它,它很容易出错:
bool removeNext = false;
var myList = collection.Where(i =>
!(i.ToUpper().Contains("TEXT IN UPPER") || i.Contains("some other text")) &&
(!removeNext | (removeNext = i.Contains("some text"))));
解释
&&
之前的条件会删除我们绝对不关心的所有文本。这基本上是我在你最初的问题下的评论(这本身就是一个很好的预过滤结果的解决方案)。&&
的第二部分内容如下:
“如果removeNext
为false
或者如果赋值的结果removeNext=i.Contains(“某些文本”)
为true
,请选择项目。”
这里的|
是关键,因为即使removeNext
是false
,我们仍然希望执行第二部分中的赋值
我们不使用
|
运算符,因为它是一个,这意味着如果第一部分返回true
,它就不需要计算第二部分(通常我们希望进行此优化),removeNext
值将永远不会更改。将其作为父条件移动,并使用not符号,剩余的if,else if,在itI内部,我经常这样做。我不介意它看起来如何。您可以使用“continue”关键字,这样它会提示您正在试图避免使用else。continue对我有效,谢谢:)如果您有(BoolExpression1 | BoolExpression2)
,则在执行OR操作之前会对这两个表达式求值。如果您有(BoolExpression1 | | BoolExpression2)
,则会出现短路行为,如果BoolExpression1
为true
,则决定使用OR