Nameプロパティを持つ項目の単純なリスト(UniqueList)には、一意の項目(名前が異なると定義されている)のみが含まれていなければなりません。タイプパラメータの制約:インターフェイスと抽象クラス
public abstract class NamedItem
{
public abstract string Name { get; }
}
だからUniqueListができ:
interface INamed
{
string Name { get;}
}
または抽象クラス:
class UniqueList<T> : List<T> where T : INamed
または
class UniqueList<T> : List<T> where T : NamedItem
UniqueListタイプの制約は、インターフェースすることができ
クラス関数AddUni QUE:ラインで
Error: Operator '==' cannot be applied to operands of type 'T' and 'T'
で
public T AddUnique(T item)
{
T result = Find(x => x.Name == item.Name);
if (result == default(T))
{
Add(item);
return item;
}
return result;
}
クラス型制約は、インターフェイスに基づいている場合、コンパイル結果
if (result == default(T))
すべては、私は抽象的にUniqueListをベース場合もありますクラス。何かご意見は?
は、なぜあなたは、このために 'HashSetの'を使用していない:
はここ構造の実装の両方クラスを使用しています私のコードを、ですか? – BrokenGlass
Tが値型の場合、何も見つからない場合に 'default(T)'を返しますか?これは 'default(T)'があなたの意図ではないかもしれない値として許可されていないことを意味します。 –
@BrokenGlassしかし、彼は一連の文字列を作成していないので、名前付きのものを作成しています。彼は本当に 'IEqualityComparer 'で' HashSet を望んでいる。 –
phoog