代码之家  ›  专栏  ›  技术社区  ›  zzandy

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

  •  12
  • zzandy  · 技术社区  · 17 年前

    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
    
    4 回复  |  直到 17 年前
        1
  •  29
  •   Carra    13 年前

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

    [TestMethod]
    public void Test()
    {
      var enums = (myEnum[])Enum.GetValues(typeof(myEnum));
      Assert.IsTrue(enums.Count() == enums.Distinct().Count());
    }
    
        2
  •  21
  •   Jon Skeet    17 年前

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

        3
  •  13
  •   Vlad Rudenko    8 年前

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

    [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));
    }
    
        4
  •  0
  •   AndreasN    17 年前
    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)));
    }
    

        5
  •  0
  •   Ali    6 年前

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

    var uniqueData = temp.Select(u => new tblschClassSchedule
                {
                    TeacherName = u.TeacherName,
                    SubjectName = u.SubjectName,
    
                }).Distinct() ;
    

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