2012-02-01 43 views
0

我试图用IEnumerable.Except功能在C#4.0中得到这样两个列表之间的差异有一个清单开展工作不起作用 - 它不会删除room_list的项目。除了功能不,我从XML文件

(我在调试检查,room_list包含所需值)

dal.GetAllRooms是一个函数得到所有房间从XML文件中的数据访问层。

我相信问题是关于XML,因为当我使用我的DAL实现与列表(而不是xml)相同的确切函数工作正常。

回答

1

你忽略了Object.EqualsRoom?或者你执行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)); 
+0

我会尝试,但我不认为这很重要,因为它在我使用我的dal列表实现时起作用。 – 2012-02-01 09:52:39

2

由丹尼尔给出的实施是正确的,当你正在检查是否相等。但为了使用除了()用于自定义类,您需要覆盖您的自定义类的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”}。