I would first create a pre-evaluated subset list containing duplicates:
var dupes = list.Where(a => list.Count(b => b.Name.Equals(a.Name)) > 1).ToList();
.ToList()
ensures this query is only evaluated once. This will make a huge difference in speed if the list is large.
Now if your list is a List<>
, you can use the RemoveAll()
method:
list.RemoveAll(item => item.Price == 500 && dupes.Contains(item));
And you're done.
But if your list is only known to be IEnumerable<>
, or you don't want to modify the source list, or you want deferred execution, then just use LINQ:
var result = list.Where(item => !(item.Price == 500 && dupes.Contains(item)));
This will be evaluated when you enumerate result
.