2012-12-08 123 views
0

可能重複:
Can’t operator == be applied to generic types in C#?使用通用鍵在節點結構中查找子節點?

我有我試圖使一個查找方法 「GenericNode」 -parent /子結構。

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:是同一類型的?

我可以創建一個Guid for key的派生類,並將GetChildNodeById移動到該類,但如果可能的話,我想要一個通用的解決方案。有什麼想法嗎?

+1

我不確定這是相關的:http://stackoverflow.com/a/6380001/555547。改變'=='爲'.Equals()'爲我編譯它。祝你好運! – Jason

+0

我是個白癡,Equals()做了這個把戲,Raphaëls鏈接解釋了爲什麼。 – antirysm

回答

1

有很多的方式來實現這一目標:

  1. 做一個約束,使TKey : IComprabale,然後在GetNodeByKey您可以在關鍵撥打Compare

  2. 作一個約束,使TKey : IEquatable<TKey>,那麼你可以調用Equals關鍵。

  3. 而不是使用相等運算符,在密鑰上調用Equals。請注意,您冒這樣的風險NullReferenceException,並且爲了檢查關鍵字爲null,您需要添加約束TKey : class

  4. 撥打電話Object.Equals。請注意,如果您的密鑰是值類型,這會導致性能下降,因爲在調用Object.Equals時,它們將被裝箱。

  5. 讓樹類的用戶提供他的比較器。我會建議採用標準.NET集合的模式。例如看看Dictionary可以帶比較器的不同構造函數。

+0

6.你可以使用動態 –

+0

@lukas - 除了我在.NET 3.5,否則好主意。 – antirysm

+0

另外,優秀的指針,我會探索你已經列出的選項,謝謝! – antirysm