我很奇怪,爲什麼當我嘗試不加我的對象列表中時,它的複製,它仍然將它添加C#列表中的重複
if (thePreviousList.Contains(thePreviousItem))
{
}
else
{
thePreviousList.Add(thePreviousItem);
}
例如thepreviousitem ID = 1,名稱=測試 如果我有另一個對象具有相同的ID和相同的名稱它仍然會添加它...
我很奇怪,爲什麼當我嘗試不加我的對象列表中時,它的複製,它仍然將它添加C#列表中的重複
if (thePreviousList.Contains(thePreviousItem))
{
}
else
{
thePreviousList.Add(thePreviousItem);
}
例如thepreviousitem ID = 1,名稱=測試 如果我有另一個對象具有相同的ID和相同的名稱它仍然會添加它...
如果你不想重載Equals,你可以使用LINQ來檢查是否使用相同的ID和名稱的對象(這不一定相同對象)已經存在:
if (thePreviousList.Any(item => item.ID == thePreviousItem.ID
&& item.Name == thePreviousItem.Name))
{
}
else
{
thePreviousList.Add(thePreviousItem);
}
您需要正確實施Equals
方法對您試圖添加到列表中的對象。要確定列表是否已包含傳遞的對象,Contains
方法使用的是Equals
。
因爲List<>.Contains
正在檢查引用不檢查列表中的對象的屬性。
爲了達到此目的,您應該覆蓋Equals
,對於最佳做法,也可以覆蓋GetHashCode
。規則應該是當Equals
返回true時,應該返回相同的散列碼。
類似以下內容對您來說應該足夠了:
public override bool Equals(object obj)
{
var i = obj as YourType;
if(i == null) return false;
return i.Id == this.Id && i.Name == this.Name;
}
public override int GetHashCode()
{
return this.Id.GetHashCode()^this.Name.GetHashCode();
}
從文檔:
該方法通過使用默認的相等比較確定的平等,由對象的實現IEquatable的定義(Of T).T的等式方法(列表中值的類型)。
如果您還沒有實施IEquatable<T>.Equals
,它使用默認的引用相等。或者,您實現了IEquatable<T>.Equals
,但沒有正確執行。
例如thepreviousitem ID = 1,名稱=測試,如果我有相同的id和另一個同名的對象仍然會增加它...
你需要像
class Foo : IEquatable<Foo> {
public int Id { get; private set; }
public string Name { get; private set; }
public Foo(int id, string name) {
this.Id = id;
this.Name = name;
}
public bool Equals(Foo other) {
return this.Id == other.Id && this.Name == other.Name;
}
}
最後,如果檢查重複項是你將要做的很多事情,那麼你不應該使用List<T>
。你應該使用HashSet<T>
。
您不一定需要爲了實現'IEquatable
這聽起來從您對其他答案的意見,你不想覆蓋Equals
。
可以代替做到這一點:
if (thePreviousList.Any(item => thePreviousItem.id == item.id && thePreviousItem.name == item.name))
{
}
else
{
thePreviousList.Add(thePreviousItem);
}
也許你想使用詞典('TKEY的,TValue)',而不是名單 – 2012-03-29 15:24:00