C# 枚举列表之间的And操作
我有两个枚举列表,我想在它们之间执行某种类型的操作。假设我的枚举定义有3个元素true、false和NAC# 枚举列表之间的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
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?
,一个可为空的布尔值。那么您也要重复数据消除吗?基本上你的问题目前还不清楚。区分“我想要一个作用于两个值并返回一个值的操作”和“我想要提供两个输入列表并获得一个输出列表,对每对元素应用相同的操作”是非常值得的