2010-11-01 193 views
25

我正在學習編寫lambda expressions,我需要幫助瞭解如何從列表中刪除不在另一個列表中的所有元素。通過removeall過從列表1中刪除項目不在列表2中

var list = new List<int> {1, 2, 2, 4, 5}; 
var list2 = new List<int> { 4, 5 }; 

// Remove all list items not in List2 
// new List Should contain {4,5}  
// The lambda expression is the Predicate. 
list.RemoveAll(item => item. /*solution expression here*/); 

// Display results. 
foreach (int i in list) 
{ 
    Console.WriteLine(i); 
} 

回答

49

爲此,您可以使用包含:

list.RemoveAll(item => !list2.Contains(item)); 

或者,如果你只是想交集,使用Enumerable.Intersect會更有效:

list = list.Intersect(list2).ToList(); 

不同的是,在後一種情況下,你不會得到重複的條目。例如,如果list2包含2,則在第一種情況下,您會得到{2,2,4,5},在第二種情況下,您將得到{2,4,5}

+0

如果您是比較對象而不是標量,請參閱我對此答案的增強(下面) – horace 2012-04-30 19:54:07

8

此問題已被標記爲已回答,但有一個問題。如果你的列表包含一個對象,而不是一個標量,你需要做更多的工作。

我一遍又一遍地用Remove()和RemoveAt()以及各種各樣的東西試過,沒有一個能正常工作。我甚至無法使Contains()正常工作。從來沒有匹配過任我被困住了,直到我懷疑它可能無法正確匹配項目。

當我意識到這一點時,我重構了類來實現IEquatable,然後它開始工作。

這裏是我的解決方案:

class GenericLookupE : IEquatable<GenericLookupE> 
{ 
    public string ID { get; set; } 

    public bool  Equals(GenericLookupE other) 
    { 
     if (this.ID == other.ID)  return true; 

     return false; 
    } 
} 

我這樣做後,裏德·科普塞以上的removeAll()答案完全爲我工作。

參見:http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

8
list = list.Except(list2).ToList(); 
2

比賀拉斯對象更簡單的方法了:

如果您的列表中包含的對象,而不是一個標量,它是簡單的,由一個選定的屬性移除的對象:

var a = allActivePatientContracts.RemoveAll(x => !allPatients.Select(y => y.Id).Contains(x.PatientId));