c# - 通用类比较

标签 c# generics

我想创建一个通用类 Node,如下所示:

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

  public Node<T>()
  {
  }
}

在我的主要类(class)(或其他类(class))中,我想比较项目.. 类似于以下内容:(我使用伪代码来说明我的想法,代码可能有效也可能无效)。基本上我想知道我拥有的项目是否在列表中。

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;
    }
  }
}

我知道为了比较一个类的两个实例,我必须从 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”类型的操作数 请指教。 谢谢!

最佳答案

您可以使用 IEqualityComparer<T> :

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

关于c# - 通用类比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40936418/

相关文章:

C# 随机数生成器 -1 还是 1?

java - 是否可以实现一个带有 <Generic extends X> 类型参数的类?

c# - 重构以使用具有不同输入对象的通用函数

c++ - 简单的 rust 通用/模板添加功能

java - 几乎循环类型绑定(bind)的递归类型参数

c# - 如何访问与类实例同名的命名空间?

c# - 无法在同一 block 中启用已禁用的控件

c# - 当我使用 .net 图表在页面上显示图片时,它只显示一个页面

c# 退出使用 lambda 的泛型 ForEach

c# - SQLiteConnection DisposedObject