2011-02-25 32 views
2
retval.AddRange(oldList.Union(newList)); 

無論是oldListnewList在這裏宣佈請在兩個List <SelectListItem>

List<SelectListItem> oldList = new List<SelectListItem>(); 
List<SelectListItem> newList = new List<SelectListItem>(); 

我想聯盟這兩個列表,刪除具有相同的「文本」重複的項目屬性正確工會。如果在文本屬性上newList和oldList之間存在重複,它應該保留newList的文本/值對。

上面的聯盟似乎沒有做任何事情,除了連接列表幾乎不知道爲什麼。

我在做什麼錯?

回答

2

我想聯合這兩個列表,刪除具有相同「文本」屬性的重複項目。

Union方法將不處理此要求。你可以通過這樣做:

retVal.AddRange(newList); // Since you want to keep all newList items, do this first 

// Add in all oldList items where there isn't a match in new list 
retVal.AddRange(oldList.Where(i => !newList.Any(n => i.Text == n.Text))); 
+1

@Reed:'newList.Union(oldList)'會做到這一點。看到我的迴應。 –

+1

@Jim:只有在相等比較器按照OP期望的方式處理這個時。但是,鑑於他的陳述,比較者沒有在做OP的比較......(可能是檢查文本和值,而不是文本是否相等)。 –

+0

此查詢具有糟糕的表現。正確的方法是構建一個HashSet或使用GroupJoin。 – usr

1

從閱讀似乎A.Union(B)實際上只是增加了AB這些項目是不是已經在Adocumentation。那就是:

當用這種 方法返回的對象被列舉聯盟列舉 第一和第二的順序和 產生具有不 已經得到每個元素。

快速測試證明了這一點。所以oldList.Union(newList)將保留舊值,而newList.Union(oldList)會給你新的值。

這裏是我的測試代碼:

class MyThing 
    { 
     public string Text { get; private set; } 
     public int Version { get; private set; } 

     public MyThing(string t, int v) 
     { 
      Text = t; 
      Version = v; 
     } 

     public override int GetHashCode() 
     { 
      return Text.GetHashCode(); 
     } 

     public override bool Equals(object obj) 
     { 
      if (obj == null) 
       return false; 
      MyThing other = obj as MyThing; 
      if (other == null) 
       return false; 
      return this.Text.Equals(other.Text); 
     } 
    } 

    static List<MyThing> oldList = new List<MyThing>() 
    { 
     new MyThing("Foo", 0), 
     new MyThing("Bar", 0), 
     new MyThing("Fooby", 0), 
    }; 

    static List<MyThing> newList = new List<MyThing>() 
    { 
     new MyThing("Barby", 1), 
     new MyThing("Bar", 1) 
    }; 

    static void DoIt() 
    { 
     var unionOldNew = oldList.Union(newList); 
     Console.WriteLine("oldList.Union(newList)"); 
     foreach (var t in unionOldNew) 
     { 
      Console.WriteLine("{0}, {1}", t.Text, t.Version); 
     } 
     Console.WriteLine(); 
     var unionNewOld = newList.Union(oldList); 
     Console.WriteLine("newList.Union(oldList)"); 
     foreach (var t in unionNewOld) 
     { 
      Console.WriteLine("{0}, {1}", t.Text, t.Version); 
     } 
    } 
+2

只有在類型中的Equals比較設置正確的情況下才有效。這在OP的課堂中顯然不是這樣,因爲他明確提到了Union正在做一個Concat(這意味着它不僅限於他的Text屬性) –

相關問題