![](/img/trans.png)
[英]Check value in a List<Class> contains in any List<String> usingLambda
[英]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.