2013-09-14 2 views
-1

У меня есть это:многомерный массив сумма

  • Cat = 1 Dog = 2 Мышь = 4 Дом = 8 Ball = 16 Музыка = 32

И если я получаю значение из SQL = 3 - Я хочу, чтобы результат был «Cat, Dog» Если значение = 7, то «Cat, Dog, Mouse» и soo on.

Любая помощь?

+0

Это Су заблуждение! – OneFineDay

+1

Это было бы более разумно, если бы вы имели дело с перечислением флага, я думаю. – Tim

ответ

-3

Вы можете использовать linq, где можно проверить, меньше или меньше указанного значения.

Dictionary<int, string> wordList = new Dictionary<int, string> { 
      {1, "Cat"}, 
      {2, "Dog"}, 
      {4, "Mouse"}, 
      {8, "House"}, 
      {16, "Ball"}, 
      {32, "Music"}, 
     }; 

     int number = 7; 

     StringBuilder builder = new StringBuilder(); 
     foreach (KeyValuePair<int, string> word in 
      wordList.Where(pair => pair.Key <= number)) { 
      builder.Append(word.Value); 
      builder.Append(", "); 
     } 
+0

Меньше, чем, к сожалению, не работает в этом случае. Если 'valueFromSQL = 6', возможно, не будет печатать Cat. – Zong

+0

Спасибо Лямбда, отлично работает, если я даю нечетные числа, но когда я даю 2 или 8, я возвращаюсь только кошка, собака, мышь. Need 8 = House – user2778395

+0

Спасибо @ user2778395, я изменил его от менее чем до менее или равного ему. –

0

Предположим, что мы имеем enum Item = { Cat = 1, ... }:

StringBuilder sb = new StringBuilder(); 

foreach(Item i in Enum.GetValues(typeof(Item))) 
    if ((valueFromSQL & ((int)i)) != 0) { 
     if (sb.Length > 0) 
      sb.Append(", "); 
     sb.Append(i); 
    } 

string result = sb.ToString(); 

Это обрабатывает нулевые и единичные значения (например valueFromSQL = 4.) Правильно. Это работает, потому что битовое представление значений являются следующим:

Name   Decimal Binary 

Cat   1   ...0001 
Dog   2   ...0010 
Mouse   4   ...0100 
valueFromSQL 3   ...0011 

Обратите внимание, каждый Item значения использует только один уникальный бит. Когда вы добавляете эти значения, вы эффективно или бит вместе. Таким образом, мы можем использовать побитовое И для проверки того, является ли бит для определенного значения отличным от нуля.

+0

@nietaki Я думаю, вам все равно нужно будет указать значения. IIRC C# просто использует последовательные целые числа. – Zong

+0

Может ли пояснитель объяснить? – Zong

2

http://ideone.com/aPqPqE

[System.Flags] 
enum Things { Cat = 1, Dog = 2, Mouse = 4, House = 8, Ball = 16, Music = 32 } 

class Program 
{ 

    static void Main() 
    { 

     var value = Things.Cat | Things.Dog; 

     Console.WriteLine(value.ToString()); 
    } 
} 
+1

Удивительно! Никогда не знал об этом. – Zong

+2

Ничего себе, кто бы отказал в этом ответе? И почему это не было принято? Был ли один из двух других плакатов фактически пониженным, чтобы продвигать их (относительно низкое качество) ответ? Излишне говорить, что принятый ответ довольно плох. – Zong

Смежные вопросы