2014-04-28 43 views
2

我有以下標誌枚舉:檢查標誌枚舉containts所有字符串

[Flags] 
public enum RoleModels { 
    Master = 1 << 0, 
    Editor = 1 << 1, 
    Member = 1 << 2 
} 

而且我有一個RoleModels變量和字符串列表:

var roles1 = RoleModels.Master | RoleModels.Member; 

List<String> rolesStrings = new List<String> { "mAster", "Member" } 

我想檢查是否所有rolesStrings在角色中。

檢查應該不區分大小寫......在這種情況下,它將是真實的。

我試圖將字符串轉換爲一個枚舉:

var roles2 = (RoleModels)rolesStrings.Aggregate((a, b) => a | b); 

再檢查,不知何故,如果所有roles2在roles1。

但我無法使這項工作...

可能有人,請幫幫我嗎?

謝謝你, 米格爾

+0

是'{ 「康師傅」, 「會員」}'還是你的意思'{ 「大師」, 「會員」}' – MethodMan

+2

@DJKRAZE:他明確表示退房是不區分大小寫的,所以它應該可以兼容。 – Chris

+1

然後他可以在我看來嘗試這樣的事情 'bool result = Enum.GetNames(typeof(RoleModels))。Contains(「rolesStrings [0]」);'..等使用||條件在他的支票以及如果他喜歡 – MethodMan

回答

4

你可以這樣說:

var roles1 = RoleModels.Master | RoleModels.Member; 
List<String> rolesStrings = new List<String> { "mAster", "Member" } 

bool hasFlag = true; 
foreach (var role in rolesStrings) 
{ 
    RoleModels enumValue; 

    if (!(Enum.TryParse(role,true, out enumValue) && roles1.HasFlag(enumValue))) 
    { 
     hasFlag = false; 
     break; 
    } 
} 

這裏是fiddle

+2

有一個TryParse忽略與轉換相比更容易(也更強大)的情況。 http://msdn.microsoft.com/en-us/library/dd991317(v=vs.110).aspx – Chris

+1

@Chris啊,你是對的。我完全忘記了,謝謝 –

+0

沒有問題。我不知道它在那裏,但肯定肯定有一種方法,並找到它。 :) – Chris

2

一個LINQ-指明分數版本Selman22的回答:

var roles1 = RoleModels.Master | RoleModels.Member; 
List<String> rolesStrings = new List<String> { "mAster", "Member" }; 

RoleModels enumValue; 
var valid = rolesStrings.All(r => (Enum.TryParse(r, true, out enumValue) && 
            roles1.HasFlag(enumValue))); 

請注意,All()將返回true如果rolesStrings爲空,因爲所有0個元素都是有效的。

1

我的代碼的版本,以最小的改動:

var roles1 = RoleModels.Master | RoleModels.Member; 

List<String> rolesStrings = new List<String> { "mAster", "Member", "editor" }; 

var roles2 = rolesStrings.Select(x=>(RoleModels)Enum.Parse(typeof(RoleModels),x, true)).Aggregate((a, b) => a | b); 

if ((roles1&roles2)==roles2) 
{ 
    Console.WriteLine(String.Format("{0} (roles2) are in {1} (roles1)", roles2, roles1)); 
} 
else 
{ 
    Console.WriteLine(String.Format("{0} (roles2) are not in {1} (roles1)", roles2, roles1)); 
} 

關鍵的事情需要注意的是,對於roles2我用Enum.Parse到sdtrings轉換爲其枚舉值。如果沒有匹配的枚舉,這將失敗(如果獲得未驗證的數據,這可能很重要)。

我然後彙總它們,並使用(roles1&roles2)==roles2檢查中角色2是角色1.這工作,因爲當施加&在roles2任何一點,是不是在角色1不會被設置一切,所以它將不再匹配角色2進行比較。

如果您需要對輸入值進行驗證,則可以使用更爲詳細的方法(如其他建議),但我提供此解決方案作爲您嘗試的方法的最接近的「修復」,而不是向您展示一個完全不同的方法。

0

使用Enum.GetNames

var rolesStrings = new List<String> { "mAster", "member" }; 
var enums = Enum.GetNames(typeof(RoleModels)); 
var result = rolesStrings.All(roleString => enums.Any(enumString => String.Equals(roleString,enumString, StringComparison.OrdinalIgnoreCase)); 
+0

冗餘ToList和Containts不區分大小寫。 – CSharpie

+0

我檢查了LINQPad中的代碼,它工作正常。包含區分大小寫 –

+0

是的,它應該是INsensitiv – CSharpie