LINQ query to find if items in a list are contained in another list
I have the following code:
List<string> test1 = new List<string> { "@bob.com", "@tom.com" };
List<string> test2 = new List<string> { "[email protected]", "[email protected]" };
I need to remove anyone in test2 that has @bob.com or @tom.com.
What I have tried is this:
bool bContained1 = test1.Contains(test2);
bool bContained2 = test2.Contains(test1);
bContained1 = false
but bContained2 = true
. I would prefer not to loop through each list but instead use a Linq query to retrieve the data. bContained1 is the same condition for the Linq query that I have created below:
List<string> test3 = test1.Where(w => !test2.Contains(w)).ToList();
The query above works on an exact match but not partial matches.
I have looked at other queries but I can find a close comparison to this with Linq. Any ideas or anywhere you can point me to would be a great help.
Solution 1:
var test2NotInTest1 = test2.Where(t2 => test1.Count(t1 => t2.Contains(t1))==0);
Faster version as per Tim's suggestion:
var test2NotInTest1 = test2.Where(t2 => !test1.Any(t1 => t2.Contains(t1)));
Solution 2:
bool doesL1ContainsL2 = l1.Intersect(l2).Count() == l2.Count;
L1 and L2 are both List<T>
A simple explanation is : If resulting Intersection of two iterables has the same length as that of the smaller list (L2 here) ,then all the elements must be there in bigger list (L1 here)
Solution 3:
var output = emails.Where(e => domains.All(d => !e.EndsWith(d)));
Or if you prefer:
var output = emails.Where(e => !domains.Any(d => e.EndsWith(d)));
Solution 4:
No need to use Linq like this here, because there already exists an extension method to do this for you.
Enumerable.Except<TSource>
http://msdn.microsoft.com/en-us/library/bb336390.aspx
You just need to create your own comparer to compare as needed.
Solution 5:
something like this:
List<string> test1 = new List<string> { "@bob.com", "@tom.com" };
List<string> test2 = new List<string> { "[email protected]", "[email protected]" };
var res = test2.Where(f => test1.Count(z => f.Contains(z)) == 0)
Live example: here