重複の可能性:
C# で 2 つの列挙型が等しいのはいつですか?
単純なステート マシンの一部として、次のクラスがあります。
すべてのジェネリック型パラメーターは列挙型でなければならないことに注意してください。これはコンストラクターで強制されています (ここには示されていません)。
// 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);
}
}
上記はコンパイルされますが、これがジェネリック型パラメーターとして渡された列挙型を処理する正しい方法であるかどうかはわかりません。
注: 比較関数では、順序を考慮する必要はありません。むしろ、正確な重複をチェックする必要があります。