【问题标题】:Finding children in node structure using generic key? [duplicate]使用通用键在节点结构中查找子节点? [复制]
【发布时间】:2012-11-26 09:17:27
【问题描述】:

可能重复:
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) 不起作用,因为它无法在 GetChildNodeById 方法中将 node.keykeyToFind 进行比较。我一直在尝试不同的通用约束等,但没有运气。如何指定 TKey:s 是同一类型?

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

【问题讨论】:

  • 我不确定这是否相关:stackoverflow.com/a/6380001/555547。将 == 更改为 .Equals() 为我编译了它。祝你好运!
  • 我是个白痴,Equals() 成功了,Raphaëls 链接解释了原因。

标签: c# generics .net-3.5


【解决方案1】:

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

  1. 做一个约束,让TKey : IComprabale,然后在GetNodeByKey你可以在key上调用Compare

  2. 做一个约束,让TKey : IEquatable&lt;TKey&gt;,然后你可以在key上调用Equals

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

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

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

【讨论】:

  • @lukas - 除了我在 .NET 3.5 上,否则是个好主意。
  • 另外,很好的指点,我会探索你列出的选项,谢谢!
  • 动态很好,但有两个大问题:1. 它们不是类型安全的,因此在运行时而不是在编译时发现错误,2. 它们非常慢。
猜你喜欢
  • 1970-01-01
  • 2011-09-11
  • 2010-12-12
  • 2021-07-16
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2018-07-14
相关资源
最近更新 更多