2014-04-28 2 views
2

I가 다음과 같은 플래그 열거 :확인 플래그 열거 모든 문자열을 containts 경우

var roles1 = RoleModels.Master | RoleModels.Member; 

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

내가 모든 있는지 확인하고 싶습니다 : 나는 변수 RoleModels 및 문자열 목록을

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

그리고 rolesStrings는 역할에 있습니다.

수표는 대소 문자를 구별하지 않아야합니다 ...이 경우 사실입니다.

나는 하나의 열거로 문자열을 변환하려고했다 : 다음

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

그리고 확인, 어떻게 든, 모든 roles2이 roles1에있는 경우.

하지만이 일을 할 수 없습니다 ...

는 누군가가, 나 좀 도와 주 시겠어요?

는 미구엘에게, 감사

+0

는'{ "마스터", "회원"}'또는'의미 { "마스터", "회원"}' – MethodMan

+2

@DJKRAZE는 않았다이다 : 그는 명시 적으로 말했다 체크 대소 문자를 구분하지 않으므로 둘 중 하나에서 작동해야합니다. – Chris

+1

다음 그는 내 생각에 이런 식으로 시도 할 수 'bool result = Enum.GetNames (typeof (RoleModels)). 포함 ("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

prob. 나는 그것이 거기에 있었다는 것을 몰랐지만 확실하게 방법이 있어야하고 그것을 발견해야한다고 생각했다. :) – Chris

2

Selman22의 대답의 LINQ-ified하게 버전 :

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()은 012를 반환합니다.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을 위해 내가 그들의 열거 값으로 sdtrings 변환 Enum.Parse을 사용했다고합니다. 일치하는 열거 형이 없으면 실패합니다 (유효성이 확인되지 않은 데이터를 가져 오는 경우 중요 할 수 있습니다).

그런 다음 (roles1&roles2)==roles2을 사용하여 역할 2의 모든 항목이 역할 1에 있는지 확인하십시오. 역할 1에 속하지 않는 역할 2의 비트는 &이 적용될 때 설정되지 않으므로 더 이상 일치하지 않으므로 작동합니다. 비교했을 때 roles2.

입력 값의 유효성 검사를 수행해야하는 경우 제안 된 다른 제안과 같은보다 자세한 방법을 사용하는 것이 더 나을 수 있지만 제시 한 방법과 가장 가까운 "수정"으로이 솔루션을 제공합니다 완전히 다른 방법.

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

관련 문제