我試圖用IEnumerable.Except功能在C#4.0中得到這樣兩個列表之間的差異有一個清單開展工作不起作用 - 它不會刪除room_list的項目。除了功能不,我從XML文件
(我在調試檢查,room_list包含所需值)
dal.GetAllRooms是一個函數得到所有房間從XML文件中的數據訪問層。
我相信問題是關於XML,因爲當我使用我的DAL實現與列表(而不是xml)相同的確切函數工作正常。
我試圖用IEnumerable.Except功能在C#4.0中得到這樣兩個列表之間的差異有一個清單開展工作不起作用 - 它不會刪除room_list的項目。除了功能不,我從XML文件
(我在調試檢查,room_list包含所需值)
dal.GetAllRooms是一個函數得到所有房間從XML文件中的數據訪問層。
我相信問題是關於XML,因爲當我使用我的DAL實現與列表(而不是xml)相同的確切函數工作正常。
你忽略了Object.Equals
在Room
?或者你執行IEquatable
?如果不是,Except
檢查引用是否相同,即使實例內的所有值都相同,它們也不相同。
例子:
class Room
{
public Room(int roomNumber) { RoomNumber = roomNumber; }
public int RoomNumber { get; set; }
}
class Room2
{
public Room2(int roomNumber) { RoomNumber = roomNumber; }
public int RoomNumber { get; set; }
public override bool Equals(object other)
{
var otherRoom = other as Room2;
if(otherRoom == null)
return false;
return roomNumber == otherRoom.RoomNumber
}
}
var room1a = new Room(404);
var room1b = new Room(404);
var room2a = new Room2(405);
var room2b = new Room2(405);
Assert.False(object.Equals(room1a, room1b));
Assert.True(object.Equals(room2a, room2b));
由丹尼爾給出的實施是正確的,當你正在檢查是否相等。但爲了使用除了()用於自定義類,您需要覆蓋您的自定義類的GetHashCode()方法。請參見下面的代碼片斷:
class Program
{
static void Main()
{
ObservableCollection<A> one = new ObservableCollection<A>();
ObservableCollection<A> two = new ObservableCollection<A>();
one.Add(new A()
{
number = 1,
name = "A"
});
one.Add(new A()
{
number = 2,
name = "B"
});
two.Add(new A()
{
number = 1,
name = "A"
});
ObservableCollection<A> three = new ObservableCollection<A>(one.Except(two));
}
}
class A : IEquatable<A>
{
public int number;
public string name;
public bool Equals(A other)
{
return (number == other.number && name == other.name);
//throw new NotImplementedException();
}
public override int GetHashCode()
{
// Get the hash code for the Textual field if it is not null.
int hashnumber = number == null ? 0 : number.GetHashCode();
// Get the hash code for the Digital field.
int hashname = name.GetHashCode();
// Calculate the hash code for the object.
return hashnumber^hashname;
}
}
這裏將具有值作爲{2, 「B」}。
我會嘗試,但我不認爲這很重要,因爲它在我使用我的dal列表實現時起作用。 – 2012-02-01 09:52:39