C# 使用枚举数据C创建对象列表

C# 使用枚举数据C创建对象列表,c#,algorithm,enums,C#,Algorithm,Enums,所以我有一个枚举: public enum myEnum { IBM = 1, HP = 2, Lenovo = 3 } 我有一门品牌课 我想创建一个品牌对象列表,其中包含来自MyEnum的数据。比如: private IEnumerable<Brand> brands = new List<Brand> { new Brand(myEnum.IBM.ToString(), (int) myEnum.IBM), new Brand

所以我有一个枚举:

public enum myEnum
{
    IBM = 1,
    HP = 2,
    Lenovo = 3
}
我有一门品牌课

我想创建一个品牌对象列表,其中包含来自MyEnum的数据。比如:

private IEnumerable<Brand> brands = new List<Brand>
{
    new Brand(myEnum.IBM.ToString(), (int) myEnum.IBM),
    new Brand(myEnum.HP.ToString(), (int) myEnum.HP),
    new Brand(myEnum.Lenovo.ToString(), (int) myEnum.Lenovo),
};
我可以创建两个数组——一个使用enum名称,另一个使用enum id,并对它们进行预处理,以便为每次迭代创建Brand对象,但不知道是否有更好的解决方案

最后,我将使用Royi Mindel解决方案,因为我认为这是最合适的。非常感谢Daniel Hilgarth的回答,感谢他帮助Royi Mindel的建议发挥作用。如果可以的话,我会在这个问题上赞扬他们两人

public static class EnumHelper
{
    public static IEnumerable<ValueName> GetItems<TEnum>() 
        where TEnum : struct, IConvertible, IComparable, IFormattable
    {
        if (!typeof(TEnum).IsEnum)
            throw new ArgumentException("TEnum must be an Enumeration type");

        var res = from e in Enum.GetValues(typeof(TEnum)).Cast<TEnum>()
                  select new ValueName() { Id = Convert.ToInt32(e), Name = e.ToString() };

        return res;
    }
}

public struct ValueName
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我建议创建一个通用的ValueName类来适应所有的枚举,而不是创建特定的类来适应特定的枚举

public static class EnumHelper
{
    public static IEnumerable<ValueName> GetItems<TEnum>() 
        where TEnum : struct, IConvertible, IComparable, IFormattable
    {
        if (!typeof(TEnum).IsEnum)
            throw new ArgumentException("TEnum must be an Enumeration type");

        var res = from e in Enum.GetValues(typeof(TEnum)).Cast<TEnum>()
                    select new ValueName() { Value = Convert.ToInt32(e), Name = e.ToString()};

        return res;
    }

}

public struct ValueName
{
    public int Value { get; set; }
    public string Name { get; set; }
}
那么你只要做:

EnumHelper.GetItems<myEnum>()

您的代码非常好,但我正在为您的代码更改位级简化

枚举类未更改:

public enum myEnum
{
    IBM = 1,
    HP = 2,
    Lenovo = 3
}
Brand classChange参数长度,可以传递枚举的一个参数:

public class Brand
{
    public Brand(Enum Data)
    {
        Name = Data.ToString();
        Id = Convert.ToInt32(Data); 
    }

    public string Name { get; private set; }
    public int Id { get; private set; }
}
这里是这样的改变:

private IEnumerable<Brand> brands = new List<Brand>
{
    new Brand(myEnum.IBM),
    new Brand(myEnum.HP),
    new Brand(myEnum.Lenovo),
};

您喜欢看这个示例:

我认为这是一个最好的解决方案!!!请看一看。在Brand类中仅保留MyEnum,并创建一个属性,如果required@MaxMommersteeg:BTW:StyleCop确实突出显示了分号,这是一个问题:代码包含一个额外的分号。[StyleCop规则:SA1106]我们鼓励反对者发表评论,这样我就可以纠正你认为不正确的地方。提示:我测试了这段代码,它很有效。谢谢你的回答,Ramesh!我相信通过我的方式,Brand类接口和用法更加清晰-它接受名称和id并初始化相应的属性。我喜欢您的通用解决方案。但是我需要Value属性的类型为int,并且我无法强制转换:选择新的ValueName{Value=inte,Name=e.toString}。建议?它给出错误-无法将“System.Enum”类型的表达式强制转换为TEnum类型。否,相同的错误。无论如何,谢谢你。我将和丹尼尔·希尔加思一起去。不过,非常喜欢你的方法。要让它工作,只需用Cast替换Cast,并用简单的Convert.ToInt32删除奇怪的GetEnumInt方法。检查我的答案以供参考。将答案更新为有效答案,谢谢@DanielHilgarth
public class Brand
{
    public Brand(Enum Data)
    {
        Name = Data.ToString();
        Id = Convert.ToInt32(Data); 
    }

    public string Name { get; private set; }
    public int Id { get; private set; }
}
private IEnumerable<Brand> brands = new List<Brand>
{
    new Brand(myEnum.IBM),
    new Brand(myEnum.HP),
    new Brand(myEnum.Lenovo),
};