Skip to main content
Email Password   helpLost your password?

Introduction  

Having two generic lists (List<MyClass>), how do I remove from List1 all the instances of List2, matching a property?

This is the setup. I have a class:  

public class MyClass
{
    public int MyValue { get; set; }
    public int MyOtherValue { get; set; }
}

And two lists:

List<MyClass> list1 = new List<MyClass>();
list1.Add(new MyClass() { MyValue = 1, MyOtherValue = 10 });
list1.Add(new MyClass() { MyValue = 2, MyOtherValue = 20 });
list1.Add(new MyClass() { MyValue = 3, MyOtherValue = 30 });
list1.Add(new MyClass() { MyValue = 4, MyOtherValue = 40 });

List<MyClass> list2 = new List<MyClass>();
list2.Add(new MyClass() { MyValue = 2, MyOtherValue = 50 });
list2.Add(new MyClass() { MyValue = 3, MyOtherValue = 60 });

I want to remove all list2 instances from list1 matching the MyValue property.
 

Solution 

Method 1: Loop and LINQ
list2.ForEach(l2 => { list1.RemoveAll(l1 => l1.MyValue == l2.MyValue); });

Method 2: LINQ and Loop
(from l1 in list1 join l2 in list2 on l1.MyValue equals l2.MyValue
 select l1).ToList().ForEach(i => list1.Remove(i));

Output (from both)
MyValue: 1 MyOtherValue: 10
MyValue: 4 MyOtherValue: 40

Performance

Don’t be fooled that Method1 may look prettier than Method2. Performance depends on the size of the lists. Method1 scales very badly when list2 has more than a few elements compared to the size of list1.
List1 size: 1.000.000
{
     List2 size: 10
     Method 1: 103 ms
     Method 2: 325 ms

     List2 size: 100
     Method 1: 5534 ms
     Method 2: 682 ms
}

List1 size: 1.000
{
     List2 size: 100
     Method 1: 1 ms
     Method 2: 11 ms

     List2 size: 900
     Method 1: 32 ms
     Method 2: 12 ms
}

And it gets all bad when both lists are large:

List1 size: 100.000
{
     List2 size: 90.000
     Method 1: 297834 ms
     Method 2: 7555 ms
}


Conclusion 

Use Method2 unless you are sure that the list that you want to remove is very small compared to the main list (<50 elements).

History

2009-11-06: First version

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralMy vote of 2 Pin
Paulo Zemek
1:02 10 Nov '09  
GeneralRe: My vote of 2 Pin
Henrik Sterndorff Jessen
6:27 11 Nov '09  


Last Updated 9 Nov 2009 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009