簡體   English   中英

Contains()返回false,即使它應該返回true

[英]Contains() returns false even though it should return true

我目前正在嘗試檢查我的某些列表是否包含一個對象。 該列表是一個對象的列表,該對象由包含2個字段的結構組成。

我正在嘗試運行這個小代碼:

if(m_EatingMoves.Contains(i_Move))
{
  ....
}

但是即使我在調試中可以肯定地看到想要的Move都位於* m_EatingMove *列表中時,該表達式仍會返回false,我認為問題可能是我的結構中沒有Equals的替代項,所以我發現StackOverFlow上的實現,但表達式仍然返回false。 除了實現我自己的Contains()之外的任何想法?

這是結構:

    public struct Cell
    {
        public int Row;
        public int Col;

        public Cell(int i_Row, int i_Col)
        {
            this.Row = i_Row;
            this.Col = i_Col;
        }

        public override bool Equals(object obj)
        {
            if (!(obj is Cell))
                return false;

            Cell cell = (Cell)obj;
            return cell.Col == Col && cell.Row == Row;
        }
    }

現在我有另一個由上面的結構組成的對象:

    public class Move
    {
        private Board.Cell m_Source;
        private Board.Cell m_Destination;

        public Move(Board.Cell i_Source, Board.Cell i_Destination)
        {
            m_Source = i_Source;
            m_Destination = i_Destination;
        }
....(Properties, etc..)

最后,我們有了由構造函數初始化的列表

private List<Move> m_EatingMoves

您必須為GetHashCode()以及Equals()提供覆蓋。 要么是,要么實現IEquatable<T>

Contains方法是Linq擴展,它使用默認的相等比較器。 來自文檔

Default屬性檢查類型T是否實現System.IEquatable接口,如果是,則返回使用該實現的EqualityComparer。 否則,它返回一個EqualityComparer,它使用由T提供的Object.Equals和Object.GetHashCode的覆蓋。

您還需要覆蓋GetHashCode方法,以便兩個相等的單元格返回相同的哈希碼。 經常使用的一種模式是對要比較的項目的哈希碼進行異或運算,例如:

public struct Cell
{
   [...]
   public override int GetHashCode()
   {
       return Row.GetHashCode() ^ Col.GetHashCode();
   }
}

如果不重寫此方法,數據結構可能無法正確比較相等性,從而導致您觀察到的行為。 MSDN GetHashCode有關於如何在框架中使用此方法的其他文檔。

我建議您不要比較對象/結構(帶有潛在多種副作用的難以預測的任務),使用簡單類型(例如字符串)為您的對象添加某種唯一ID,並基於該ID使用Contains() 此外, struct是一種值類型,因此可能會導致裝箱/拆箱的一些問題(可能是這種情況)。 問候,AB

通常, List<T>.Contains是使用EqualityComparer<T>比較元素的通用方法。 在你的情況下,它調用Object.Equals ,你可以覆蓋Object.Equals

您可以參考MSDN List(T)。包含方法

暫無
暫無

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

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