簡體   English   中英

如何列出 <T> 檢查是否包含自定義結構?

[英]How list<T> to check whether contains a custom struct?

我有以下實現

// 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進入if塊而不是else塊? 我對此實現感到困惑。

誰能向我解釋Contains方法如何評估像struct這樣的值類型?

if部分僅檢查我們是否在列表中尋找null項目。 如果這樣做,它將遍歷列表,並在列表項中查找null值。 這部分僅對引用類型有效,因為值類型不能為null

else另一方面的一部分,是做的所有檢查的情況下,當產品不能null ,所以這段代碼被用於structs為好。 它所做的是為該類型( EqualityComparer<T> c = EqualityComparer<T>.Default )獲得一個默認的相等比較器,並使用此比較器在列表中查找項目。

您需要了解的是value typereference type之間的區別。

就像intlong等一樣, struct不是存儲在heap而是存儲在stack reference typestack上存儲了一個指向實際對象數據的指針(這是一個內存地址),該stack存儲在heap

(繼續閱讀有關堆棧和堆之間的區別。)

然而,加入了struct的東西像一個ArrayList甚至List<object>仍然會起作用,因為它極有可能被裝箱為reference type第一,因此struct西港島線不能 null ,即使你通過了default(<struct type>)它仍然不會為 null

然后,就像@dotnetom解釋的else部分一樣,執行並評估struct是否在集合中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM