我正在foreach循环中执行if,if,if,else序列。在其中一个州,我不想做任何事情。看起来有点怪异,我想知道是否有更好的方法可以做到这一点?
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);
}
答案 0 :(得分:2)
您可以反转条件并将其余代码放入其中。
(可选)您也可以颠倒条件以获得if (!removeNext)
,使代码简短一些并且可以说更具可读性,但是也可能使赋值removeNext = false
无效,因为它可能已经是错误的了(但这是微不足道的罚款)。
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")))
{
if (!removeNext)
myList.Add(item);
removeNext = false;
}
}
但就我个人而言,我认为您所拥有的“扁平”,未嵌套的if
更易于阅读,而带有一点注释的continue
命令会让您很清楚该块故意没有任何代码,为什么。
答案 1 :(得分:0)
写该逻辑的另一种方法是跟踪当前项是否被删除。然后,您可以从确定实际是否将当前项目添加到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);
}
答案 2 :(得分:0)
仅提供另一种可能性,您可以在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("some text")
是true
,请选择项目”
|
是关键,因为即使removeNext
是false
,我们仍然要在第二部分进行赋值。
我们不使用||
运算符,因为它是short-circuiting operator,这意味着,如果第一部分返回true
,则不必费心去评估第二部分(通常我们想要此优化),而removeNext
的值将永远不会改变。