C # Linq Delete list entries that are contained in line []
Right now I am doing something like this to remove words from myList which works ok ,
List<string> myList = matches
.Cast<Match>()
.Select(m => m.Value)
.Distinct()
.ToList();
myList.RemoveAll((x) => x.Contains("word1")
|| x.Contains("word1")
|| x.Contains("word2")
|| x.Contains("word3")
|| x.StartsWith("D")
);
string[] ab = new string[] { "word1", "word2", "word3" };
But now I want to provide a list of strings [] instead of adding x.Contains ("blah blah") Second, I also want to combine both statements into one, making it one linq query.
+3
source to share
2 answers
Enumerable.Except is your friend for filtering items. You will need to make a final Where
order to handle the case StartsWith
.
IEnumerable<string> filtered = myList.Except(ab);
So, completely:
IEnumerable<string> myList = matches.Select(_ => _.Value)
.Distinct()
.Except(new [] { "word1", "word2", "word3" })
.Where(_ => !_.StartsWith("D"));
+5
source to share
If all of its word exclusion is what you're looking for, just use Except:
var toIgnore = new List<string> { "word1", "word2" };
var myList = matches.Cast<Match>().Select(m => m.Value).Except(toIgnore).Where(t => !t.StartsWith("D").ToList();
If, instead, you want to exclude any text that contains an exclusion list, you can write an extension method in line:
public static class StringExtensions
{
public static book ContainsAny(this string source, params string[] lookFor)
{
if (!string.IsNullOrEmpty(source) && lookFor.Length > 0) { return lookFor.Any(source.Contains); }
return false;
}
Then your LINQ:
var MyList = matches.Cast<Match>().Select(m => m.Value).Where(s => !s.ContainsAny(toIgnore)).Where(t => !t.StartsWith("D").ToList();
+1
source to share