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