I have the following code:
List test1 = new List { \"@bob.com\", \"@tom.com\" };
List test2 = new List
List test1 = new List { "@bob.com", "@tom.com" };
List test2 = new List { "joe@bob.com", "test@sam.com", "bets@tom.com" };
var result = (from t2 in test2
where test1.Any(t => t2.Contains(t)) == false
select t2);
If query form is what you want to use, this is legible and more or less as "performant" as this could be.
What i mean is that what you are trying to do is an O(N*M) algorithm, that is, you have to traverse N items and compare them against M values. What you want is to traverse the first list only once, and compare against the other list just as many times as needed (worst case is when the email is valid since it has to compare against every black listed domain).
from t2 in test we loop the email list once.
test1.Any(t => t2.Contains(t)) == false we compare with the blacklist and when we found one match return (hence not comparing against the whole list if is not needed)
select t2 keep the ones that are clean.
So this is what I would use.