2010-08-02 10 views
3

두 개의 작은 int 값 (범위 0-3)을 사용하고 해당 값을 기준으로 Color 개체를 반환하는 C#에서 함수를 작성하려고합니다. 문제는 프로그래밍 방식으로 두 값에서 색상을 결정할 수있는 방법이 없다는 것입니다. LED의 유형에 따라 다르며 하드 코딩해야합니다.두 개의 값을 하나의 개체에 매핑하십시오.

내가 생각할 수있는 가장 단순한 방법은 각 값을 검사하는 방대한 (16 가지 경우) if-else 문이지만 매우 훌륭한 해결책은 아닌 것 같습니다. 색상을 결정하는 더 좋은 방법이 있습니까?

답변

2

Color 객체의 2 차원 배열은 어떻습니까?

Color[,] colors = new[,] { 
    { Color.FromArgb(1, 2, 3), Color.FromArgb(3, 4, 5), Color.FromArgb(6, 7, 8), Color.FromArgb(9, 10, 11) }, 
    { Color.FromArgb(21, 22, 23), Color.FromArgb(23, 24, 25), Color.FromArgb(26, 27, 28), Color.FromArgb(29, 30, 31) }, 
}; 

Color color = colors[index1, index2]; 
+0

배열 경로로 가면 배수를 수동으로 구현하는 것보다 다차원 배열이나 들쭉날쭉 한 배열이 확실히 좋습니다. 유일한 단점은 매핑이 올바른지 확인하기 위해 사소한 계산이며 스파 스 매핑이 필요한 경우에는 null입니다. –

+0

이것은 내 목적에 꼭 필요한 모든 것이지만 매튜의 제안도 좋아합니다. 불행하게도 나는 일하고있다.Tuple 클래스를 지원하지 않는 .NET 3.5. 다들 감사 해요. – Nate

1

if/else을 사용하는 대신에 약간 더 깨끗한 방법으로 색상 값을 배열에 배치하고 두 개의 작은 int 값을 배열의 인덱스로 사용할 수 있습니다.

2

당신이 (좋든 나쁘 든)이 OO 접근 방식을 가고 싶은 경우에, 당신은 Tuple-> 색상 매핑을 사용할 수는없는 스파 스 될 수있는 2 차원 배열을 통해

Dictionary<Tuple<int, int>, Color> d = new Dictionary<Tuple<int, int>, Color>() 
{ 
    {Tuple.Create(2, 1), Color.Red}, 
    {Tuple.Create(1, 1), Color.Blue}, 
    {Tuple.Create(1, 2), Color.Green} 
}; 

장점을 nulls. 인덱스 순서로 초기화하지 않고 컬렉션 초기화 프로그램을 사용할 수도 있습니다. 두 색상에 대해 동일한 튜플을 사용하려고하면 초기화시에 명백한 ArgumentException이 표시됩니다.

+0

왜이 하나가 downvoted지고 있는지 모르겠습니다. 이것은 희소성을 적절히 처리하는 유일한 솔루션이며 모두의 확장 성이 가장 뛰어납니다. 이것을 3- 변수 케이스로 쉽게 확장 할 수 있으며 변수 범위를 쉽게 늘리거나 줄일 수 있습니다 (범위가 다를뿐만 아니라). downvote의 가치가 전혀 없습니다. – drharris

-3

if else 문의 무리를 방지의 선호하는 방법은 Switch를 사용하는 것입니다. 당신은 또한 enum를 사용하고 소규모의 int에 해당 INT 값을 지정할 수 있습니다 :

public enum ColorChoice 
{ 
    red = 01 //'01' instead of '1' to make clear your first digit is zero 
    blue = 02 
    green = 03 
    ...etc... 
] 
+2

이 방법으로 두 개의 입력 인수를 처리하여 색상을 해결하는 문제를 해결할 수 있습니까? –

+0

@ kirk Woll - 마지막으로 확인한 시간에 인덱스로 Enum 값을 호출 할 수 있습니다. 그래서, "0, 1"=> "1"=> ​​ColorChoice.Red의 입력. 실제 수학 변환이 필요한 많은 솔루션보다 실제로 이해하기 쉽기 때문에 (따라서 유지 관리가 용이합니다.) – AllenG

+0

정수를 열거 형으로 형변환 할 수 있습니다. 그러나 당신은 어느 시점에서 수학 전환을해야 할 것입니다. 예 : 어떻게 3,1 -> 오렌지색을합니까? 귀하의 계획에 따라, 그것은 분명히 오렌지 = 31 일 것이고 수학 (10 * x + y)을 필요로합니다. 또한 01은 사실 8 진수입니다. 그냥 결과 * 여기에 영향을 미치지 않는 일이 *. 또한 C# enum에는 필드 나 메서드가 없어야하므로 다른 ColorChoice-> Color 매핑이 필요할 수도 있습니다. –

0

나는 16 색에 대한 열거 투표

enum Color 
{ 
    red = 0, 
    blue = 1 
} 

public Color GetColor(int v1, int v2) 
{ 
    int colorValue = v1 << 8; 
    colorValue |= v2; 
    return (Color)colorValue; 
} 
+0

곱셈기를 사용하는 것이 가장 읽기 쉬운 구문입니까? 나는 이것이 많은 프로그래머를 언덕으로 보낼 것이라고 생각한다. –

+0

대신에 비트 시프트 할 수는 있지만 프로그래머의 별도 하위 집합을 보내 줄 것이라고 생각합니다. –

+0

-1 대신 각 범위가 0-4가 될 때 어떻게됩니까? 수식과 모든 것과 마찬가지로 열거 형의 전체 초기화가 변경됩니다. 영리하지만 전혀 실용적이지 않습니다. – drharris

0

방법에 대해 :

static Color GetColor(int c1, int c2) 
{ 
    if (c1 > 3 || c1 < 0 || c2 > 3 || c2 < 0) 
    throw new ArgumentOutOfRangeException(); 

    var map = new Dictionary<string, Color> 
    { 
    {"00", Color.Black}, 
    {"10", Color.Red}, 
    {"20", Color.Blue}, 
    // etc, etc... 
    {"11", Color.DimGray}, 
    }; 

    var key = c1.ToString() + c2.ToString(); 
    return map[key]; 
} 
0

사실 두 개의 작은 정수 값을 결합하여 무언가 (적어도 하나의 색상)를 의미하게 만들었다는 사실은 나에게 당신이 그 구조체를 캡슐화하도록 정의 된 구조체를 갖는 것이 합리적 일 수 있음을 암시합니다. 엠.

이렇게하면 사전에 대한 키로 구조체를 사용할 수 있다는 이점이 있습니다. Equals 및 GetHashCode 메서드는 이미 적절하게 작동해야합니다.

다음은 예제입니다. 색상을 계산할 수 없다고 언급 했으므로 사전을 채워야하는 위치에 의견을 남겼습니다. 당신은 이것을 하드 코딩 할 수 있지만 파일이나 임베디드 리소스에서 값을 읽는 것이 이상적입니다.

EDIT : 내 예제 구조체를 변경할 수 없도록 업데이트했습니다.

struct MyStruct 
{ 
    private byte _X; 
    private byte _Y; 

    public MyStruct(byte x, byte y) 
    { 
     _X = x; 
     _Y = y; 
    } 

    public byte X { get { return _X; } } 
    public byte Y { get { return _Y; } } 

    private static Dictionary<MyStruct, Color> _ColorMap; 

    static MyStruct() 
    { 
     _ColorMap = new Dictionary<MyStruct, Color>(); 

     // read color mapping from somewhere...perhaps a file specific to the type of LED 
    } 

    public Color GetColor() 
    { 
     return _ColorMap[this]; 
    } 
} 
관련 문제