2016-12-02 53 views
1

我想創建一個通用類節點如下:通用分類比較

public class Node<T> 
{ 
    public Node<T> Next; 
    public Node<T> Previous; 
    T Content; 

    public Node<T>() 
    { 
    } 
} 

在我的主要(或其他類),我想比較的項目..類似以下內容:(我用僞代碼來說明我的想法,代碼可能會或可能不會真正起作用)。基本上我想找到我所擁有的物品是否在列表中。

main() 
{ 
    List<Node<T>> n = new List<Node<T>>() 
    bool found = false; 
    T v = new T(); 
    foreach (Node<T> i in n) 
    { 
    if i.Content== v 
    { 
     found = true; 
    } 
    } 
} 

我瞭解,以比較類的2個實例,我不得不得出從IEquitable我的課,但我想知道如果T屬於我們已經使用所有的時間如int被預定義類,double,string ...我不想重新定義這些類,但會期望比較起作用並使用默認比較器。我如何編寫上述內容以便c#能夠接受它並拋出語法錯誤?

if i.Content== v 
    { 
     found = true; 
    } 

我已經試過

if (T)i.Content == (T)v 
{ 
    ... 
} 

編譯器似乎並不喜歡它。 其實,我做了以下內容:

Node<T> r = n.Where(x=> (T)x.Content==(T)v).FirstOrDefault() 

我得到的錯誤是: ==操作符不能應用於類型的操作數「T」和「T」 請指教。 謝謝!

+0

嘗試.Equals而不是== – DoctorMick

+0

你是否真的在代碼中使用'T'作爲你的類型? – Abion47

回答

4

您可以使用IEqualityComparer<T>

var comp = EqualityComparer<T>.Default; 
if (comp.Equals(i.Content, v)) { 
    ... 
} 
+0

這真棒!正是我想要的! BTW,Abion47解決方案似乎也起作用。他的聲明更加明確一些?這太糟糕了,我不能將它們都標記爲答案。 – user1205746

0

沒有辦法在泛型約束中指定運算符(除非無參數構造函數,如果您認爲它是運算符)。

如果您需要某種比較方式,您需要使用一種方法。要麼使用Equals,要麼添加一些界面,如IComparable<T>作爲通用約束。

1

你可以改變你Node<T>聲明如下:

public class Node<T> where T : IEquatable<T> 

那麼你就可以使用:

if (i.Content.Equals(v)) 
    // ... 
+0

您的建議似乎也適用。謝謝!你們真棒! – user1205746