和枚举列表之间的操作

时间:2014-01-20 15:57:38

标签: 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 = True
False && False = False
NA && NA =  NA 

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

2 个答案:

答案 0 :(得分:4)

使用您描述的逻辑,开始编写可以在两个值上执行所需的And操作的方法。这实际上很容易处理,好像其中任何一个值False都返回False,如果没有False而另一个值NA则返回NA,如果两者都是真的,你就会返回真实,唯一剩下的情况。

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));

答案 1 :(得分:2)

bool?Nullable<bool>)有三个值,如果您使用逻辑和(&)运算符,则会为您提供所需的所有值:

(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