2012-02-01 24 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」}。