我试图用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