2016-10-18 3 views
1

У меня небольшая проблема, и я не могу найти ответ нигде. Я постараюсь держать его коротким и яснымC# Чтение одного или нескольких целых значений и назначение объекта определенным атрибутам enum на основе целых чисел.

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

Chest = 1 
Shoulders = 2 
Arms = 4 
Legs = 8 
Back = 16 

До сих пор у моего класса «упражнение» есть имя и это перечисление. Теоретически это должно привести к тому, что что-то вроде «Бех-пресс-сундук, руки n/Deadlift - назад, ноги» и так далее.

Далее У меня есть Каталог классов, в котором содержатся все упражнения, а в этом классе - метод AddExercise. Вот фрагмент кода:

public void AddExercise() 
    { 
     Exercise ToAdd = new Exercise(); 
     Console.WriteLine("What is the name of the exercise?"); 
     string name = Console.ReadLine(); 
     ToAdd.name = name; 
     katalog.Add(ToAdd); 
    } 

То, что я хочу сделать известно, включают в себя «Какие группы мышц делает удар тренировки?», А затем MULTICHOICE с указанными группами мышц. Моя идея заключается в том, что это будет выглядеть примерно так:

1. Chest 
2. Shoulders 
3. Arms 
4. Legs 
5. Back 
6. That is all 

Пока человек продолжал выбирать 1-5 упражнения приобретут атрибуты перечислений, а затем выйти из цикла, как только человек выбрал 6, но я не знаю, как это сделать. Из большинства увиденных Ive перечислений они в основном используются в строковом формате и синтаксическом анализе, поэтому я понятия не имею, как назначать атрибуты, читая целое число. И самая сложная часть - это назначение нескольких из них.

Вот мое перечисление, кстати:

[Flags] 
public enum BodyParts : int 
{ 
    None = 0, 
    Chest = 1, 
    Shoulders = 2, 
    Biceps = 4, 
    Triceps = 8, 
    Back = 16, 
    Legs = 32 
} 

Спасибо за ваши ответы.

+0

Какой интерфейс вы используете? MVC или WPF или WinForm? – Nathan

+0

Независимо от того, что вы используете, это несколько более чем просто. Вы можете получить список перечислений с помощью Enum.GetNames (typeof (BodyParts)). ToDictionary (n => n, n => Enum.Parse (typeof (BodyParts), n)); – Nathan

+0

И добавьте логику интерфейса, чтобы использовать значение для мультисвязывания (WPF) или computedValue (угловое/ko.js в MVC) для сопоставления значений флага. Скажем, сундук | Плечи == 3. – Nathan

ответ

1

Вы можете иметь справочную таблицу, соединяющую строку ответа на перечисление значений

var lookup = new Dictionary<string,BodyParts >() { 
{ "chest" , BodyParts .Chest}, 
{ "shoulders " , BodyParts .Shoulders} 
... 
}; 

и использовать его как этот

string name = Console.ReadLine().ToLower; 
var bodypart = BodyParts.None; 
lookup.TryGetValue(name, out bodypart); 
katalog.Add(bodypart)); 
0

Использовать CheckedListBox где элементы являются случаи перечисления.

var clb = new CheckedListBox();  
foreach (BodyParts bp in Enum.GetValues(typeof(BodyParts))) 
      clb .Items.Add(bp); 

Затем, чтобы получить помеченный сочетание всех отмеченных элементов, просто bitwise or (объединить их). Результатом будет битмаска, в которой есть все выбранные части тела.

var result = clb.CheckedItems 
       .Cast<BodyParts>() 
       .Aggregate(BodyParts.None,  
       (current, bp) => current | bp); 
Смежные вопросы