2016-12-02 4 views
1

Я хотел бы создать общий класс Node следующим образом:Общий класс сравнения

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, но я хотел бы знать, если Т принадлежит к предопределенным классам, которые мы использовали все времена, как межды , 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() 

ошибки я получил: == Оператор не может применяться к операндам типа «Т» и «Т» Пожалуйста посоветуйте. Спасибо!

+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

Смежные вопросы