检查字符串列表是否包含任何枚举字符串值
本文关键字:字符串 枚举 何枚举 列表 是否 包含任 检查 | 更新日期: 2023-09-27 18:09:07
enum KnownError
{
[StringValue("CODE-001")]
CODE001,
[StringValue("CODE-002")]
CODE002,
[StringValue("CODE-003")]
CODE003,
[StringValue("CODE-004")]
CODE004,
[StringValue("CODE-005")]
CODE005
}
List<string> errors = {"ahah", "eheh", "CODE-005", "uhuh"};
假设我有一个字符串错误列表。如何检查是否有任何错误是"已知的"?
bool ContainsKnownError(List<string> error)
{
return errors.Where(error => Enum.IsDefined(typeof(KnownError), error) == true).Count() > 0;
}
这似乎行不通。如何在 linq 查询中访问 StringValue,而不必比较每个字符串?
编辑
我尝试了@AK_解决方案,使用 Intersect,但我收到此编译错误:
The type arguments for method 'System.Linq.Enumerable.Intersect<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEnumerable<TSource>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
真实场景是一个 Error 对象,其中包含一个字符串字段,其代码如下所示
class Error { string code; }
List<Error> errors = GetErrors();
var knownErrors = Enum.GetValues(typeof(KnownError));
bool exists = errors.Select(error => error.code).Intersect(knownErrors).Any();
var knownErrors = Enum.GetValues(typeof(KnownError));
return errors.Contains(error => knownErrors.Contains(error));
//or cooler:
return errors.Intersect(knownErrors).Count() > 0;
扎克的评论是正确的:return errors.Intersect(knownErrors).Any
更好...+1 他 :-(
Enum.IsDefined
需要一个对象包装的enum
实例。传递字符串名称不会产生所需的结果。
这应该有效:
KnownError ignore;
var res = errors.Any(errorCode => Enum.TryParse<KnownError>(errorCode, out ignore));
请注意使用 LINQ 的 Any
代替将Count()
与零进行比较:此方法更有效,因为它在找到第一个匹配项后立即停止。