我有一个List
用于Windows性能计数器,它是静态的,无法在运行时更改。但是,随着这个列表变得如此之大,以至于手动检测重复项非常繁琐。为此,我编写了一个可用于检查重复项的工具,但仍有可能人们忘记运行该工具或者不知道它。
我想弄清楚是否有一种方法可以在编译时检测重复项。代码看起来像这样:
public enum SampleEnum
{
[Description("Sample")]
Sample,
}
另一个定义性能计数器的类:
public class PerfCounter
{
public int CounterType { get; set; }
public string CounterName { get; set; }
}
这两个类的用法如下:
public static class PerfCounterManager
{
public static List<PerfCounter> GetCounters()
{
return new List<PerfCounter>
{
new PerfCounter
{
CounterTypeId = (int) SampleEnum.Sample1,
CounterName = GetEnumDescription(CounterType.Sample1)
},
new PerfCounter
{
CounterTypeId = (int) SampleEnum.Sample2,
CounterName = GetEnumDescription(CounterType.Sample2)
},
}
}
}
函数GetCounters()
可能被多次调用,但除了在编译期间不会被修改。
错误可能会被抛出,不仅因为CounterTypeId
可能是重复的,而且因为作为枚举描述的CounterName
可能是重复的。并且因为列表非常大,所以当有人向列表添加元素时,无法检测到此错误。如果可以在编译时检测到它,那将非常有用。
答案 0 :(得分:0)
在编译时没有太多可以完成的事情。看起来你已经有值枚举 - 不使用像Sample44 = 12
这样的东西可以防止重复的枚举值。一些合理的描述命名方案可以帮助描述重复。
安全解决方案是添加单元测试,只需检查该条件 - 每个人都运行单元测试并立即看到问题。 (如果你没有单元测试 - 这是开始使用它们的好借口。)
答案 1 :(得分:0)
使用HashSet<T>
或SortedSet<T>
作为List<T>
的后备存储。类似下面的内容,尽管您可能需要一个合适的IEqualityComparer才能正确定义您的唯一性概念。这不会通过抛出编译时错误来强制实现唯一性,但它会保证唯一性。可能是一个有用的扩展来修改事情来执行此操作并记录有关任何缺乏唯一性的消息,用于诊断目的......因此您可以追踪有罪的一方并彻底击败它们:^)
public static class PerfCounterManager
{
public static List<PerfCounter> GetCounters()
{
return new List<PerfCounter>
{
new SortedSet<PerfCounter>
{
new PerfCounter
{
CounterTypeId = (int) SampleEnum.Sample1,
CounterName = GetEnumDescription(CounterType.Sample1)
},
new PerfCounter
{
CounterTypeId = (int) SampleEnum.Sample2,
CounterName = GetEnumDescription(CounterType.Sample2)
},
}
}
}
}
[顺便说一句,虽然我爱我的iPad,但是为了编写代码,这是我用过的最糟糕的事情。]