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.
list2.ForEach(l2 => { list1.RemoveAll(l1 => l1.MyValue == l2.MyValue); });
(from l1 in list1 join l2 in list2 on l1.MyValue equals l2.MyValue
select l1).ToList().ForEach(i => list1.Remove(i));
MyValue: 1 MyOtherValue: 10
MyValue: 4 MyOtherValue: 40
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 }
Use Method2 unless you are sure that the list that you want to remove is very small compared to the main list (<50 elements).
2009-11-06: First version
| You must Sign In to use this message board. | |||||||||||
|
|||||||||||
|
|||||||||||
|
|||||||||||