C# 如何仅在数组元素的枚举值为';使用Linq满足s布尔值
我使用下面的条件检查C# 如何仅在数组元素的枚举值为';使用Linq满足s布尔值,c#,linq,C#,Linq,我使用下面的条件检查myArray是否正好有一个元素isClosed=false if (myArray.Count(x => !x.isClosed) == 1) { } 我想检查并查看唯一的错误元素(根据我的上述情况)是否为color=red 从枚举中 public enum Color {red, blue, yellow}; 所以一般来说,我想首先匹配条件,测试一个falseisClosed元素,并检查同一元素是否有color=red 更新 我想按以下顺序检查两件事: 如果只
myArray
是否正好有一个元素isClosed=false
if (myArray.Count(x => !x.isClosed) == 1) {
}
我想检查并查看唯一的错误元素(根据我的上述情况)是否为color=red
从枚举中
public enum Color {red, blue, yellow};
所以一般来说,我想首先匹配条件,测试一个falseisClosed
元素,并检查同一元素是否有color=red
更新
我想按以下顺序检查两件事:
表示x
!已关闭
color=red
if (myArray.Count(x => !x.isClosed && x.color == Color.red) == 1) {
}
你能用吗&&
if (myArray.Count(x => !x.isClosed && x.color == Color.red) == 1) {
}
如果您的描述是正确的,那么您实际上需要检查两个条件
if (myArray.Any(x => !x.isClosed && x.color==Color.Red) &&
myArray.Count(x => !x.isClosed) == 1)) {
}
为了避免任何其他被否决的投票,这里有一个解释:
问题提出了两项要求:
myArray.Count(x=>!x.isClosed)==1)
color=red
myArray.Any(x=>!x.isClosed&&x.color==color.Red)
如果OP正在查找单个语句,则可以将上述语句组合到以下查询中:
myArray.Any(x =>
!x.isClosed &&
x.color == Color.Red &&
myArray.Count(y => !y.isClosed) == 1)
如果您的描述是正确的,那么您实际上需要检查两个条件
if (myArray.Any(x => !x.isClosed && x.color==Color.Red) &&
myArray.Count(x => !x.isClosed) == 1)) {
}
为了避免任何其他被否决的投票,这里有一个解释:
问题提出了两项要求:
myArray.Count(x=>!x.isClosed)==1)
color=red
myArray.Any(x=>!x.isClosed&&x.color==color.Red)
如果OP正在查找单个语句,则可以将上述语句组合到以下查询中:
myArray.Any(x =>
!x.isClosed &&
x.color == Color.Red &&
myArray.Count(y => !y.isClosed) == 1)
尝试优化版本:
bool result = myArray.Where (x => x.isClosed == false && x.color == Color.red)
.Take (2) // we need nax 2 elements to obtain the result
.Count () == 1;
尝试优化版本:
bool result = myArray.Where (x => x.isClosed == false && x.color == Color.red)
.Take (2) // we need nax 2 elements to obtain the result
.Count () == 1;
LINQ并不是专门为副作用而设计的,没有它可以更有效地实现这一点,但没有任何东西表明你不能有副作用:
int openIndex = -1;
var openCount = myArray.Select((o, i) => new { i, o }).Where(x => !x.o.isClosed).Select(io => { openIndex = io.i; return io.o; }).Count();
if (openCount == 1 && myArray[openIndex].color == Color.red) {
// found open & red at myArray[openIndex]
}
但最好只使用代码:
var openIndex = -1;
int openCount = 0;
for (int j1 = 0; j1 < myArray.Length; ++j1)
if (!myArray[j1].isClosed) {
openIndex = j1;
if (++openCount > 1)
break; // skip out early if bad
}
if (openCount == 1)
if (myArray[openIndex].color == Color.red)
// found!
如果您不关心找到的项目或测试的顺序,我认为@octavioccl的答案是正确的。LINQ并不是专门为副作用设计的,没有它可以更有效地完成这项工作,但没有任何东西表明您不能拥有它们:
int openIndex = -1;
var openCount = myArray.Select((o, i) => new { i, o }).Where(x => !x.o.isClosed).Select(io => { openIndex = io.i; return io.o; }).Count();
if (openCount == 1 && myArray[openIndex].color == Color.red) {
// found open & red at myArray[openIndex]
}
但最好只使用代码:
var openIndex = -1;
int openCount = 0;
for (int j1 = 0; j1 < myArray.Length; ++j1)
if (!myArray[j1].isClosed) {
openIndex = j1;
if (++openCount > 1)
break; // skip out early if bad
}
if (openCount == 1)
if (myArray[openIndex].color == Color.red)
// found!
如果您不关心找到的项目或测试顺序,我认为@octavioccl的答案是正确的。您可以从大量不同的答案中猜到,您的问题并不清楚。特别是,不清楚您是否想知道是否只有一个
!isClosed
元素,该元素具有颜色==color.red
,或者只有一个!isClosed
任何颜色的元素,并且该元素具有color==color.red
。你需要澄清你的问题。@onlycodemants:“我想我已经解释清楚了”——你是谁?这个问题是由用户贝恩发布的,不是你。在任何情况下,语句“我想要一个!isClosed with color==color.red”都可以用任何一种方式解释。(顺便说一句:当在评论中回复名为
的用户时,您应该包括@
,以便通知用户有他们的评论。)我认为这项任务非常简单,您可以自己尝试,如果有问题,请发布代码。经过几次尝试,我不确定做一个优雅的LINQ方法有那么简单。你可能会从大量不同的答案中猜到,你的问题并不清楚。特别是,不清楚您是否想知道是否只有一个!isClosed
元素,该元素具有颜色==color.red
,或者只有一个!isClosed
任何颜色的元素,并且该元素具有color==color.red
。你需要澄清你的问题。@onlycodemants:“我想我已经解释清楚了”——你是谁?这个问题是由用户贝恩发布的,不是你。在任何情况下,语句“我想要一个!isClosed with color==color.red”都可以用任何一种方式解释。(顺便说一句:当在评论中回复名为
的用户时,您应该包括@
,以便通知用户有他们的评论。)我认为这项任务非常简单,您可以自己尝试,如果有问题,请发布代码。经过几次尝试,我不确定做一个优雅的LINQ方法有那么简单。你的“单语句”比“两个版本”更糟糕,在Any
中查看的每一行都将调用Count
,使其成为O(n^2)
而不是O(n)
@Clockwork:“在Any中查看的每一行都将调用该计数”--我不是说我认为单语句版本确实比最初提出的版本有显著改进,但它也不是O(n^2)方法仅在前两个测试通过后调用,如果返回值为1
,则这是唯一调用该方法的时间。@clockwork muse单个语句是(计算)虽然看起来很难看,但与原版完全相同。你能推荐一种更优雅的方法来满足这两个要求吗?现在OP已经澄清了这个问题,具有讽刺意味的是,这是剩余四个未删除的答案中唯一回答OP想要问的问题的答案。(A也这么做了,但所有者在被否决后删除了它。就我个人而言,我觉得这个问题很无聊。可以编写一个非LINQ实现来实现同样的功能