我有一个包含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语句。如果所有公司都与枚举相同或者某些公司与枚举不同 有帮助吗?
答案 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
{
}