C#读取一个或多个整数值,并根据读取的整数为对象指定某些枚举属性

C#读取一个或多个整数值,并根据读取的整数为对象指定某些枚举属性,c#,enums,flags,C#,Enums,Flags,我有一个小问题,我似乎在任何地方都找不到答案。我会尽量简短明了 我有一个叫做exercises的类,它有一个enum,负责运动击中的身体部位。假设我们有 Chest = 1 Shoulders = 2 Arms = 4 Legs = 8 Back = 16 到目前为止,我的类“exercise”有一个名称,这个枚举。从理论上讲,这应该会导致类似“胸部按压、手臂/背举、双腿”之类的情况 接下来我有一个类目录,它包含所有的练习,在这个类中有一个方法,叫做AddExercise。以下是代码片段:

我有一个小问题,我似乎在任何地方都找不到答案。我会尽量简短明了

我有一个叫做exercises的类,它有一个enum,负责运动击中的身体部位。假设我们有

Chest = 1
Shoulders = 2
Arms = 4
Legs = 8
Back = 16
到目前为止,我的类“exercise”有一个名称,这个枚举。从理论上讲,这应该会导致类似“胸部按压、手臂/背举、双腿”之类的情况

接下来我有一个类目录,它包含所有的练习,在这个类中有一个方法,叫做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);
    }
我想知道的是,包括“运动影响到哪些肌肉群?”,然后是一个多选择,包括提到的肌肉群。我的想法是它看起来像这样:

1. Chest
2. Shoulders
3. Arms
4. Legs
5. Back
6. That is all
只要这个人一直选择1-5,这个练习就会获得enum属性,然后在这个人选择6后退出循环,但我不知道如何完成这部分。从我所看到的大多数枚举中,它们主要用于字符串格式和解析,所以我不知道如何通过读取整数来分配属性。最难的部分是分配其中的几个。

顺便说一下,这是我的枚举:

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

感谢您的回答。

您可以使用一个查找表将字符串答案与枚举值连接起来

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

使用
CheckedListBox
,其中项目是枚举的实例

 var clb = new CheckedListBox();    
 foreach (BodyParts bp in Enum.GetValues(typeof(BodyParts)))
            clb .Items.Add(bp);
然后,要获得所有选中项的标记组合,只需按位或(组合它们)。结果将是具有所有选定身体部位的位掩码

var result = clb.CheckedItems
              .Cast<BodyParts>()
              .Aggregate(BodyParts.None,     
                (current, bp) => current | bp);
var result=clb.CheckedItems
.Cast()
.骨料(车身零件。无,
(当前,bp)=>当前| bp);

您使用的前端技术是什么?MVC、WPF或WinForm?无论您使用什么技术,这都比简单一点。您可以通过enum.GetNames(typeof(BodyParts)).ToDictionary(n=>n,n=>enum.Parse(typeof(BodyParts),n))获得枚举列表;并添加前端逻辑以使用值进行多重绑定(WPF)或computedValue(MVC中的angular/ko.js)来映射标志值。比如说,胸部|肩部==3。
var result = clb.CheckedItems
              .Cast<BodyParts>()
              .Aggregate(BodyParts.None,     
                (current, bp) => current | bp);