我有两个列表
List<string> ingoreEducationKeywords= new List<string>(){"Uni", "School", "College",};
List<string> userEducation= new List<string>(){"MCS", "BCS", "School of Arts","College of Medicine"};
现在我想获得一个没有来自忽略列表的子字符串的列表。
要求清单{&#34; MCS&#34;,&#34; BCS&#34;}
答案 0 :(得分:6)
这是一个用自然翻译成LINQ的方式来表达你想要的东西:
userEducation
的商品(建议您从userEducation
开始)ignoreEducationKeywords
的 none 是子字符串。
Contains
这导致:
var query = userEducation
.Where(candidate => !ignoredKeyWords.Any(ignore => candidate.Contains(ignore)));
同样的思考过程可以帮助许多其他查询。
另一种选择是创建自己的None
扩展方法,假设您正在使用LINQ to Objects:
public static class Extensions
{
public static bool None(this IEnumerable<T> source, Func<T, bool> predicate)
=> !source.Any(predicate);
}
然后你可以在没有否定的情况下重写查询:
var query = userEducation
.Where(candidate => ignoredKeyWords.None(ignore => candidate.Contains(ignore)));
答案 1 :(得分:6)
这是一个相对简单的查询,可以使用Any
或All
构建,具体取决于您的偏好:
var res = userEducation
.Where(s => !ingoreEducationKeywords.Any(ignored => s.Contains(ignored)))
.ToList();
或
var res = userEducation
.Where(s => ingoreEducationKeywords.All(ignored => !s.Contains(ignored)))
.ToList();
如果列表非常大,您可以使用正则表达式同时匹配所有单词来提高性能:
var regex = new Regex(
string.Join("|", ingoreEducationKeywords.Select(Regex.Escape))
);
var res = userEducation.Where(s => !regex.IsMatch(s)).ToList();
答案 2 :(得分:3)
您可以使用Where
,Any
和Contains
:
var list = userEducation.Where(ed => !ingoreEducationKeywords.Any(ik => ed.Contains(ik)));
它会搜索userEducation
中教育没有匹配的ingoreEducationKeywords
中的所有出现。
答案 3 :(得分:0)
List<string> ingoreEducationKeywords = new List<string>() { "Uni", "School", "College", };
List<string> userEducation = new List<string>() { "MCS", "BCS", "School of Arts", "College of Medicine" };
var result = userEducation.Where(r => !ingoreEducationKeywords.Any(t => r.Contains(t))).ToList();