【问题标题】:Create a List of objects using enum data C#使用枚举数据 C# 创建对象列表
【发布时间】:2013-10-13 18:04:24
【问题描述】:

所以我有一个枚举:

public enum myEnum
{
    IBM = 1,
    HP = 2,
    Lenovo = 3
}

我有一个Brand 课程

public class Brand
{
    public Brand(string name, int id)
    {
        Name = name;
        Id = id;
    }

    public string Name { get; private set; }
    public int Id { get; private set; }
}

我想创建一个Brand 对象列表,其中填充了来自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),
};

我可以创建两个数组 - 一个带有枚举名称,另一个带有枚举 ID,并 foreach 为每次迭代创建 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; }
}

【问题讨论】:

  • 我认为这是最好的解决方案!!!
  • 看看Enum.GetNames()
  • 在 Brand 类中只保留 MyEnum,如果需要,创建一个返回 enum.ToString() 的属性
  • @MaxMommersteeg:顺便说一句:StyleCop 确实将分号突出显示为问题:“代码包含一个额外的分号。[StyleCop 规则:SA1106]”

标签: c# algorithm enums


【解决方案1】:
var brands = Enum.GetValues(typeof(myEnum))
                 .Cast<myEnum>()
                 .Select(x => new Brand(x.ToString(), (int)x))
                 .ToArray();

【讨论】:

  • 鼓励投反对票的人发表评论,这样我就可以解决您认为不正确的问题。提示:我测试了这段代码,它可以工作。
【解决方案2】:

我建议创建一个通用的 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>()

【讨论】:

  • 我喜欢你的通用解决方案。但是我需要 Value 属性为 int 类型,并且我无法强制转换:select new ValueName() { Value = (int)e, Name = e.toString() }。建议?
  • 它给出错误 - 无法将类型“System.Enum”的表达式转换为类型 TEnum。
  • 不,同样的错误。不管怎么说,还是要谢谢你。我会选择 Daniel Hilgarth 的方式。不过真的很喜欢你的方法。
  • 要使其工作,只需将Cast&lt;Enum&gt; 替换为Cast&lt;TEnum&gt; 并使用简单的Convert.ToInt32 删除奇怪的GetEnumInt 方法。检查我的答案以供参考。
  • 更新了工作的答案,感谢@DanielHilgarth
【解决方案3】:

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

枚举类(未更改):

public enum myEnum
{
    IBM = 1,
    HP = 2,
    Lenovo = 3
}

品牌类(改变参数长度,可以传一个Enum参数):

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),
};

你喜欢看这个样本:C# Iterating through an enum? (Indexing a System.Array)

【讨论】:

  • 感谢您的回答,拉梅什!我相信以我的方式 Brand 类的接口和用法会更加清晰——它接受 name 和 id 并初始化相应的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
相关资源
最近更新 更多