2012-02-03 4 views
1

입력 int 값을 기반으로 문자열 (배열에서)을 연결하고 싶습니다. 예를 들어int의 비트를 기반으로 배열 요소를 결합/결합 할 수 있습니까?

:

int Input = 3; 
string[] Items = {"A", "B", "C", "D"}; 
// output = "A, B" 

// example 2: input = 8 
// output = "D" 

배열 (0)의 첫 번째 요소는 입력 값의 최하위 비트와 연관되어야한다. 배열의 값은 ","또는 "+"와 같은 문자열로 연결됩니다.

어떻게해야할까요?

+0

을, 나는 가정한다. –

+0

직접 해봤습니까? 먼저 시도해 보시고, 가지고 계신 것으로 돌아가시기 바랍니다. –

+0

배열을 사용해야합니까? 열거 형 이름이 A, B, C ... 인 플래그 속성으로 장식 된 열거 형을 사용하지 않는 이유는 무엇입니까? –

답변

4

그래서 입력 값을 비트 마스크로 처리 하시겠습니까?

이 작동합니다 :

나는 나를 쉽게 설정이 아니라 전화 번호에 설정된 어떤 비트 알 수있게 해주는 BitArray로 전화 번호를 변환됩니다하고있어 기본적으로 어떤
int Input = 3; 
string[] Items = {"A", "B", "C", "D"}; 

var bitMask = new BitArray(new[]{Input}); 
return Items.Where((c,i)=>bitMask.Get(i)).ToArray(); 

. 그런 다음 BitArray의 해당 인덱스가 설정되었는지 여부에 따라 인덱스별로 Items 배열을 필터링하기 위해 약간의 Linq를 사용합니다.

배열에 sizeof (int) * 8 (32)보다 작은 요소가있는 경우에만 작동한다는 것을 이해하십시오. 그 외에도, BitArray 생성자에 전달 된 int [] 배열에서 함께 묶을 수있는 추가 정수 값을 지정하지 않으면 BitArray에 Get()에 대한 인덱스가 없습니다.

+0

람다 식의 좋은 사용 –

+0

이것은 LINQ와 함께하고 싶은 것처럼 보입니다. 'BitArray'는 제가 모르는 조각입니다. – JYelton

+0

실제 적용은 다양한 "OR"조건에 대해 SQL 문을 함께 붙이는 것입니다.내 경우에는 5 가지 진술과 32 가지 가능한 조합이 있습니다 (실제로 0과 31을 무효화하므로 30 개). 추가 자격있는 진술에 감사드립니다. – JYelton

2
var sb = new StringBuilder(); 
int input = 3; 
for(int i=0; i<items.Length && input != 0; i++) { 
    if((input & 1) == 1) { 
     if(sb.Length > 0) sb.Append(','); 
     sb.Append(items[i]); 
    } 
    input >>= 1; 
} 
+0

니스, 나는 간결함을 좋아한다! –

+0

일부 괄호가 빠졌습니다 :'if ((input & 1) == 1)' – ken2k

+0

@ ken2k heh - 이미 고정되었지만 감사합니다 –

0

당신은 정수의 최하위 비트를 결정하면 산술 모듈로 2

3 % 2 => 1 
4 % 2 => 0 

를 사용하여 정수의 최하위 비트를 식별 할 수 있습니다, 당신은 정수 나누기를 수행하여 최하위 비트를 폐기 할 수 있습니다 2 by

3/2 => 1 
4/2 => 2 

최하위 비트를 무시한 후에 모듈러스 연산자를 다시 사용하여 새로운 최하위 비트를 얻을 수 있습니다. 루프로 감싸면 끝났어.

[Flags] 
enum Items 
{ 
    A = 1, 
    B = 2, 
    C = 4, 
    D = 8 
} 

그런 다음 사용 : 배열이 절대적으로 필요하지 않은 경우 당신이 열거 사용할 수

0

`StringBuilder` 및 비트 교대로

string GetItems(int items) 
{ 
    string[] itemList = new string[4]; 
    int currPos = 0; 

    foreach (Items item in Enum.GetValues(typeof(Items))) 
    { 
     if ((items & (int)item) == (int)item) 
     { 
      itemList[currPos] = item.ToString(); 
      currPos++; 
     } 
    } 

    return String.Join(",", itemList, 0, currPos); 
} 
+0

이것은 실제 문자열이 긴 SQL 조건문 인 것을 제외하고는 좋은 생각입니다. 개념을 강조하기 위해 질문을 단순화했으나, 그렇지 않은 경우이 대답은 완전히 작동합니다. – JYelton

관련 문제