Возможный дубликат:
Когда два перечисления равны на С#?
У меня есть следующие классы как часть простого конечного автомата.
Обратите внимание, что все параметры универсального типа ДОЛЖНЫ быть перечислением. Это было реализовано в конструкторах (здесь не показано).
// Both [TState] and [TCommand] will ALWAYS be enumerations.
public class Transitions<TState, TCommand>: List<Transition<TState, TCommand>>
{
public new void Add (Transition<TState, TCommand> item)
{
if (this.Contains(item))
throw (new InvalidOperationException("This transition already exists."));
else
this.Add(item);
}
}
// Both [TState] and [TCommand] will ALWAYS be enumerations.
public class Transition<TState, TCommand>
{
TState From = default(TState);
TState To = default(TState);
TCommand Command = default(TCommand);
}
public sealed class TransitionComparer<TState>:
IComparer<TState>
{
public int Compare (TState x, TState y)
{
int result = 0;
// How to compare here since TState is not strongly typed and is an enum?
// Using ToString seems silly here.
result |= x.From.ToString().CompareTo(y.From.ToString());
result |= x.To.ToString().CompareTo(y.To.ToString());
result |= x.Command.ToString().CompareTo(y.Command.ToString());
return (result);
}
}
Вышеприведенное действительно компилируется, но я не уверен, что это правильный способ обработки перечислений, которые были переданы в качестве параметров универсального типа.
Примечание. Функция сравнения не должна учитывать порядок. Скорее, ему нужно проверить наличие точных дубликатов.