检查字符串列表是否包含任何枚举字符串值

本文关键字:字符串 枚举 何枚举 列表 是否 包含任 检查 | 更新日期: 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()与零进行比较:此方法更有效,因为它在找到第一个匹配项后立即停止。