使用通用密钥在节点结构中查找子节点?

时间:2012-12-08 08:42:40

标签: c# generics .net-3.5

  

可能重复:
  Can’t operator == be applied to generic types in C#?

我有一个“GenericNode” - 父/子结构,我正在尝试为其创建一个Find方法。

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 - 方法中将keyToFindGetChildNodeById进行比较。我一直在尝试不同的通用约束,没有运气。如何指定TKey:s是同一类型?

我可以使用Guid for key创建一个派生类,并将GetChildNodeById移动到该类但是如果可能的话我想要一个通用的解决方案。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

有很多方法可以实现这一目标:

  1. 制定约束以便TKey : IComprabale,然后在GetNodeByKey中,您可以在密钥上调用Compare

  2. 制定约束以便TKey : IEquatable<TKey>,然后您可以在密钥上调用Equals

  3. 不要使用相等运算符,而是在键上调用Equals。请注意,这样会冒NullReferenceException冒险,为了检查密钥是否为空,您需要添加约束TKey : class

  4. 在键上调用Object.Equals。请注意,如果您的密钥是值类型,则性能会受到影响,因为在调用Object.Equals时,它们将被装箱。

  5. 让树类的用户提供他的比较器。我建议采用标准.NET集合的模式。例如,查看可以采用比较器的Dictionary的不同构造函数。