C# 枚举列表之间的And操作

C# 枚举列表之间的And操作,c#,enums,logical-operators,C#,Enums,Logical Operators,我有两个枚举列表,我想在它们之间执行某种类型的操作。假设我的枚举定义有3个元素true、false和NA public enum myEnum { True, False, NA } 我有两个列表List1和List2,它们都包含10个元素。我想要这些结果: True && False = False True && NA = NA False && NA = False True && True = Tr

我有两个枚举列表,我想在它们之间执行某种类型的操作。假设我的枚举定义有3个元素true、false和NA

public enum myEnum {
    True,
    False,
    NA
}
我有两个列表List1和List2,它们都包含10个元素。我想要这些结果:

True && False = False
True && NA = NA
False && NA = False
True && True = True
False && False = False
NA && NA =  NA 

我想知道在C#中是否有任何内置功能可以给我上面提到的结果。我试图避免编写长代码。

首先使用您描述的逻辑编写只对两个值执行And操作的方法。这实际上是很容易处理的,因为如果其中一个值是
False
则返回
False
,如果没有一个值是
False
,一个值是
NA
,则返回
NA
,如果两个值都为true,则返回true,这是唯一剩下的情况

public static myEnum And(this myEnum first, myEnum second)
{
    if (first == myEnum.False || second == myEnum.False)
        return myEnum.False;
    if (first == myEnum.NA || second == myEnum.NA)
        return myEnum.NA;
    return myEnum.True;
}
接下来,您似乎希望比较位于同一索引的每个列表中的项目,因此将第一个与第一个、第二个与第二个等进行比较,以创建与其他两个相同大小的新列表。您可以使用
Zip
,使用我们已经定义的方法执行此逻辑操作:

var query = list1.Zip(list2, (a,b) => a.And(b));

首先,使用您描述的逻辑编写一个方法,该方法可以对两个值执行您想要的And操作。这实际上是很容易处理的,因为如果其中一个值是
False
则返回
False
,如果没有一个值是
False
,一个值是
NA
,则返回
NA
,如果两个值都为true,则返回true,这是唯一剩下的情况

public static myEnum And(this myEnum first, myEnum second)
{
    if (first == myEnum.False || second == myEnum.False)
        return myEnum.False;
    if (first == myEnum.NA || second == myEnum.NA)
        return myEnum.NA;
    return myEnum.True;
}
接下来,您似乎希望比较位于同一索引的每个列表中的项目,因此将第一个与第一个、第二个与第二个等进行比较,以创建与其他两个相同大小的新列表。您可以使用
Zip
,使用我们已经定义的方法执行此逻辑操作:

var query = list1.Zip(list2, (a,b) => a.And(b));
bool?
Nullable
)有三个值,如果您使用逻辑and(
&
)运算符,它会提供您期望的所有值:

(bool?)true  & (bool?)false = false
(bool?)true  & (bool?)null  = null
(bool?)false & (bool?)null  = false
(bool?)true  & (bool?)true  = true
(bool?)false & (bool?)false = false
(bool?)null  & (bool?)null  = null
bool?
Nullable
)有三个值,如果您使用逻辑and(
&
)运算符,它会提供您期望的所有值:

(bool?)true  & (bool?)false = false
(bool?)true  & (bool?)null  = null
(bool?)false & (bool?)null  = false
(bool?)true  & (bool?)true  = true
(bool?)false & (bool?)false = false
(bool?)null  & (bool?)null  = null

为什么不使用
bool?
而不是该枚举?您的意思是要对
listA[0]
listB[0]
等应用操作?列表是如何进入的以及输出应该是什么还不清楚。@Servy:我有三个可能的值,因此我不能使用它们bool@User1551892我没有建议使用
bool
,我建议使用
bool?
,一个可为空的布尔值。那么您也要重复数据消除吗?基本上你的问题目前还不清楚。区分“我想要一个作用于两个值并返回一个值的操作”和“我想要提供两个输入列表并获得一个输出列表,对每对元素应用相同的操作”是非常值得的为什么不使用
bool?
而不是该枚举?您的意思是要对
listA[0]
listB[0]
等应用操作?列表是如何进入的以及输出应该是什么还不清楚。@Servy:我有三个可能的值,因此我不能使用它们bool@User1551892我没有建议使用
bool
,我建议使用
bool?
,一个可为空的布尔值。那么您也要重复数据消除吗?基本上你的问题目前还不清楚。区分“我想要一个作用于两个值并返回一个值的操作”和“我想要提供两个输入列表并获得一个输出列表,对每对元素应用相同的操作”是非常值得的