如何防止枚举中的重复值?

时间:2009-09-15 07:58:06

标签: c# .net enums

我想知道有没有办法阻止enum重复密钥编译?

例如,下面的enum将编译

public enum EDuplicates
{
    Unique,
    Duplicate = 0,
    Keys = 1,
    Compilation = 1
}

虽然这段代码

Console.WriteLine(EDuplicates.Unique);
Console.WriteLine(EDuplicates.Duplicate);
Console.WriteLine(EDuplicates.Keys);
Console.WriteLine(EDuplicates.Compilation);

将打印

Duplicate
Duplicate
Keys
Keys

5 个答案:

答案 0 :(得分:18)

这是一个简单的单元测试来检查它,应该更快一点:

[TestMethod]
public void Test()
{
  var enums = (myEnum[])Enum.GetValues(typeof(myEnum));
  Assert.IsTrue(enums.Count() == enums.Distinct().Count());
}

答案 1 :(得分:17)

这不是语言规范所禁止的,因此任何符合条件的C#编译器都应该允许它。您总是可以调整Mono编译器以禁止它 - 但坦率地说,编写单元测试以扫描程序集中的枚举并以这种方式强制执行它会更简单。

答案 2 :(得分:3)

检查枚举并显示哪些特定枚举值重复的单元测试:

[Fact]
public void MyEnumTest()
{
    var values = (MyEnum[])Enum.GetValues(typeof(MyEnum));
    var duplicateValues = values.GroupBy(x => x).Where(g => g.Count() > 1).Select(g => g.Key).ToArray();
    Assert.True(duplicateValues.Length == 0, "MyEnum has duplicate values for: " + string.Join(", ", duplicateValues));
}

答案 3 :(得分:0)

public bool ValidateAllDistinct(Type enumType)
{
    return !Enum.GetNames(enumType).All(outerName
        => Enum.GetNames(enumType).Any(innerName
            => innerName == outerName 
                ? true 
                : Enum.Parse(enumType, innerName) != Enum.Parse(enumType, outerName)));
}

我的单元测试的简单测试方法。

答案 4 :(得分:0)

基于选定列具有唯一值的另一种解决方案

var uniqueData = temp.Select(u => new tblschClassSchedule
            {
                TeacherName = u.TeacherName,
                SubjectName = u.SubjectName,

            }).Distinct() ;

这将仅获得2列,并且仅获得这些列的唯一数据