Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 如何仅在数组元素的枚举值为';使用Linq满足s布尔值_C#_Linq - Fatal编程技术网

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};
所以一般来说,我想首先匹配条件,测试一个false
isClosed
元素,并检查同一元素是否有
color=red

更新

我想按以下顺序检查两件事:

  • 如果只存在一个元素,则用
    表示
    x
    !已关闭

  • 如果满足(1),则检查同一元素(满足(1))是否也满足
    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)) {
    
    }
    
    为了避免任何其他被否决的投票,这里有一个解释:

    问题提出了两项要求:

  • 只有一个元素isClosed=false
  • 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)) {
    
    }
    
    为了避免任何其他被否决的投票,这里有一个解释:

    问题提出了两项要求:

  • 只有一个元素isClosed=false
  • 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实现来实现同样的功能