我有一个“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
- 方法中将keyToFind
与GetChildNodeById
进行比较。我一直在尝试不同的通用约束,没有运气。如何指定TKey:s是同一类型?
我可以使用Guid for key创建一个派生类,并将GetChildNodeById移动到该类但是如果可能的话我想要一个通用的解决方案。有什么想法吗?
答案 0 :(得分:1)
有很多方法可以实现这一目标:
制定约束以便TKey : IComprabale
,然后在GetNodeByKey
中,您可以在密钥上调用Compare
。
制定约束以便TKey : IEquatable<TKey>
,然后您可以在密钥上调用Equals
。
不要使用相等运算符,而是在键上调用Equals
。请注意,这样会冒NullReferenceException
冒险,为了检查密钥是否为空,您需要添加约束TKey : class
。
在键上调用Object.Equals
。请注意,如果您的密钥是值类型,则性能会受到影响,因为在调用Object.Equals
时,它们将被装箱。
让树类的用户提供他的比较器。我建议采用标准.NET集合的模式。例如,查看可以采用比较器的Dictionary
的不同构造函数。