0

重複の可能性:
演算子 == を C# のジェネリック型に適用できませんか?

Find メソッドを作成しようとしている「GenericNode」-親/子構造があります。

public class GenericNode<TKey, TName>
{
  private GenericNode<TKey, TName> parent;
  private readonly TKey key;
  private readonly TName name;
  private readonly ICollection<GenericNode<TKey, TName>> children;

  public GenericNode(TKey key, TName name) {
    this.key = key;
    this.name = name;
    children = new Collection<GenericNode<TKey, TName>>();
  }

  // AddChild etc...

  public GenericNode<TKey, TName> GetChildNodeById(TKey keyToFind)
  {
    return FindChild(node => node.key == keyToFind); // <--- THIS WON'T COMPILE
  }

  private GenericNode<TKey, TName> FindChild(Func<GenericNode<TKey, TName>, Boolean> matcher)
  {
    // Recursive search returning first matching node...
  }
}

上記 (C# .NET 3.5) は - メソッドで比較できないため機能しませnode.keyん。私は運がなければ、さまざまな一般的な制約などを試してきました。TKey:s が同じ型であることを指定するにはどうすればよいですか?keyToFindGetChildNodeById

キーの Guid を使用して派生クラスを作成し、GetChildNodeById をそのクラスに移動することもできますが、可能であれば汎用ソリューションが必要です。何かご意見は?

4

1 に答える 1

0

これを達成するには多くの方法があります。

  1. TKey : IComprabale、次にキーGetNodeByKeyを呼び出すことができるように制約を作成Compareします。

  2. TKey : IEquatable<TKey>、キーを呼び出すことができるように制約を作成Equalsします。

  3. 等価演算子を使用する代わりにEquals、キーを呼び出します。そのように危険を冒すことに注意してNullReferenceExceptionください。また、キーの null をチェックするには、制約を追加する必要があることに注意してくださいTKey : class

  4. キーを呼び出しObject.Equalsます。キーが値型の場合、呼び出しObject.Equalsでボックス化されるため、パフォーマンスが低下することに注意してください。

  5. ツリー クラスのユーザーに比較子を提供させます。標準の .NET コレクションのパターンを採用することをお勧めします。たとえばDictionary、比較子を取ることができるさまざまなコンストラクターを見てください。

于 2012-12-08T08:54:30.080 に答える