簡體   English   中英

檢查字符串列表是否包含任何枚舉字符串值

[英]Check if string list contains any enum string value

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而不必比較每個字符串?

編輯

我使用Intersect嘗試了@AK_解決方案,但出現此編譯錯誤:

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;

Zack的評論是正確的: 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()與零進行比較:這種方法效率更高,因為一旦找到第一個匹配項,它就會停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM