检查枚举中的所有值列表#

时间:2017-08-01 09:44:25

标签: c# linq enums

我有一个包含ids

的整数列表
List<int> ids = new List<int>;

我在列表中添加值

list.Add(100);
list.Add(110);
list.Add(120);

我想检查列表中的所有值是否都出现在我的枚举

public enum IdEnum
{
    IT= 100,
    Bank= 110,
    Insurance= 120,
 }

目前我正在使用

if (ids.Select(x => x).All(x => Enum.TryParse(x.ToString(), out IdEnum y)))
{
    //All the companies in the list are present in the enum
}
else
{
}

即使ids列表中的一家公司与enum不同,它也应该在其他公司

在我的情况下,在两种情况下都执行if语句。如果所有公司都与枚举相同或者某些公司与枚举不同 有帮助吗?

3 个答案:

答案 0 :(得分:8)

对于任何数值,

Enum.TryParse都会返回true。根据{{​​3}}:

  

如果value是不表示TEnum枚举的基础值的整数的字符串表示形式,则该方法返回一个枚举成员,其基础值的值转换为整数类型。如果不希望出现这种情况,请调用IsDefined方法以确保整数的特定字符串表示形式实际上是TEnum的成员。

因此,请遵循此建议,只需使用IsDefined

if (ids.All(x => Enum.IsDefined(typeof(IdEnum), x)))

答案 1 :(得分:3)

您可以使用设置操作的Except,而不是在枚举值中搜索每个ID

var allIn = !ids.Except(Enum.GetValues(typeof(IdEnum)).Cast<int>()).Any();

当你使用https://docs.wso2.com/display/CLUSTER44x/Clustering+ESB+4.9.0#ClusteringESB4.9.0-Settingupthedatabases时,你为列表中的每个id做了很多额外的工作 - 检查每个值是否为null,然后在检查了这种类型的值后,对象的类型被验证为枚举检查枚举类型,检索枚举值数组,并执行值的二进制搜索。这是为每个值完成的。

另一方面,只需一次获取所有枚举值而无需额外检查值类型。然后只需从id列表中删除这些值,并检查是否有任何内容。

答案 2 :(得分:2)

if (ids.Select(x => x).All(x => Enum.IsDefined(typeof(IdEnum), x)))
{
    // All the companies in the list are present in the enum
}
else
{

}