如何列出<t>来检查是否包含自定义结构?

时间:2016-07-10 07:07:34

标签: 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<_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;
    }
}

如果itemstruct值类型,流量是否会进入if块,而不是else块? 我对这个实现很困惑。

有人可以向我解释Contains方法如何评估价值类型,例如struct

2 个答案:

答案 0 :(得分:2)

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

另一只手的else部分在项目不是null的情况下进行所有检查,因此此代码也用于structs。它的作用是获取类型(EqualityComparer<T> c = EqualityComparer<T>.Default)的默认相等比较器,并使用此比较器查找列表中的项目。

答案 1 :(得分:1)

您需要了解的是value typereference type之间的区别。

struct,就像intlong等一样,不存储在heap上,而是存储在stack上。 reference type有一个指针(存储地址)存储在stack上,指向实际对象数据存储在heap上。

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

但是,将struct添加到ArrayList甚至List<object>之类的内容仍然有用,因为它最有可能首先被装入reference type,因此{ {1}} struct,即使您通过了null,它仍然不是 default(<struct type>)

然后就会像@dotnetom一样解释null部分正在执行并评估一个else是否在集合中。