![](/img/trans.png)
[英]Why does typeof(T).IsEnum return true, even though the documentation says it should always return false?
[英]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
方法,以便兩個相等的單元格返回相同的哈希碼。 經常使用的一種模式是對要比較的項目的哈希碼進行異或運算,例如:
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.