Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何列出<;T>;检查是否包含自定义结构?_C#_List - Fatal编程技术网

C# 如何列出<;T>;检查是否包含自定义结构?

C# 如何列出<;T>;检查是否包含自定义结构?,c#,list,C#,List,我有以下实现 // Contains returns true if the specified element is in the List. // It does a linear, O(n) search. Equality is determined by calling // item.Equals(). // public bool Contains(T item) { if ((Object) item == null) { for(int i=0; i&

我有以下实现

// Contains returns true if the specified element is in the List.
// It does a linear, O(n) search.  Equality is determined by calling
// item.Equals().
//
public bool Contains(T item) {
    if ((Object) item == null) {
        for(int i=0; i<_size; i++)
            if ((Object) _items[i] == null)
                return true;
        return false;
    }
    else {
        EqualityComparer<T> c = EqualityComparer<T>.Default;
        for(int i=0; i<_size; i++) {
            if (c.Equals(_items[i], item)) return true;
        }
        return false;
    }
}
//如果指定元素在列表中,Contains返回true。
//它进行线性O(n)搜索。平等性是由调用
//item.Equals()。
//
公共布尔包含(T项){
如果((对象)项==null){

对于(int i=0;iif
部分仅检查我们是否在列表中查找
null
项。如果查找,则它遍历列表并在列表项中查找
null
值。此部分仅对引用类型有效,因为值类型不能是
null


另一方面的
else
部分在项不为
null
的情况下执行所有检查,因此此代码也用于
结构
。它所做的是为类型获取一个默认的相等比较器(
EqualityComparer c=EqualityComparer.default
)并使用此比较器查找列表中的项。

if部分仅检查我们是否在列表中查找
null
项。如果查找,则它将遍历列表并在列表的项中查找
null
值。此部分仅对引用类型有效,因为值类型不能为
null


另一方面的
else
部分在项不为
null
的情况下执行所有检查,因此此代码也用于
结构
。它所做的是为类型获取一个默认的相等比较器(
EqualityComparer c=EqualityComparer.default
)并使用此比较器查找列表中的项。

您需要了解的是
值类型
引用类型
之间的区别

struct
,就像
int
long
等一样,不是存储在
堆上,而是存储在
堆栈上。
引用类型
堆栈上有一个指向实际对象数据的指针(内存地址)

(阅读堆栈和堆之间的差异。)

但是,将
struct
添加到
ArrayList
甚至
List
之类的东西中仍然有效,因为它最有可能首先被装箱到
引用类型中,因此
struct
将不会
null
,即使您传递了
default()
它仍将不为


然后,它将像@dotnetom解释的那样,执行和评估
结构是否在集合中的
部分执行和评估
其他部分。

您需要了解的是
值类型
引用类型
之间的区别

struct
,就像
int
long
等一样,不是存储在
堆上,而是存储在
堆栈上。
引用类型
堆栈上有一个指向实际对象数据的指针(内存地址)

(阅读堆栈和堆之间的差异。)

但是,将
struct
添加到
ArrayList
甚至
List
之类的东西中仍然有效,因为它最有可能首先被装箱到
引用类型中,因此
struct
将不会
null
,即使您传递了
default()
它仍将不为


然后,它将像@dotnetom解释的那样执行并评估
结构是否在集合中的
部分执行和评估一样。它将转到
else
块,在那里-它将搜索是否使用更具体的类型而不是Equals(对象)覆盖了Equals。我不理解这个问题。它将转到
else
块,在那里-它将搜索是否使用更具体的类型而不是Equals(对象)重写了Equals。我不理解这个问题