假设我有一个字符串列表:
var searchList = new List<string>();
searchList.Add("Joe"):
searchList.Add("Bob");
我有另一个清单
var fullNameList = new List<string>();
fullNameList.Add("Joe Thompson"):
fullNameList.Add("Bob Jones");
fullNameList.Add("Bob Smith");
fullNameList.Add("Billy Smith");
fullNameList.Add("Joe Williams");
我现在想根据它是否存在于搜索列表中来过滤fullNameList,但我没有进行直接匹配,而是“开始于”匹配。所以在我的例子中,过滤后我希望这是结果
"Joe Thompson"
"Bob Jones"
"Bob Smith"
"Joe Williams"
(正如您所看到的那样,从Billy开始的记录未被包括在内,因为它没有从搜索列表中的任何项目开始)
我可以“手动”这样做:
var resultList = fullNameList.Where(r=> r.StartsWith("Joe") || r.StartsWith("Bob"));
但我希望它是动态的(因为将来可能会在搜索列表中添加更多项目)。
我可以在这样的循环中执行此操作:
var resultsList = new List<string>();
foreach (var item in searchList)
{
resultsList.AddRange(fullNameList.Where(r=>r.StartsWith(item));
}
但是想看看是否还有一个列表上的Startswith而不是单行linq代码中的单个字符串?
答案 0 :(得分:12)
var resultList = fullNameList.Where(r => searchList.Any(f=>r.StartsWith(f)));
答案 1 :(得分:2)
类似的东西:
fullNameList.Where(c=>searchList.Any(f=>c.StartsWith(f)))
答案 2 :(得分:1)
以下LINQ查询对我来说似乎是文字编程 - 并且非常简单易读。稍后再说:
var searchList = new List<string> { "Joe", "Bob" };
var fullNameList = new List<string>
{
"Joe Thompson",
"Bob Jones",
"Bob Smith",
"Billy Smith",
"Joe Williams"
};
var joesAndBobs = from name in fullNameList
from firstName in searchList
where name.StartsWith(firstName)
select name;
foreach (string str in joesAndBobs)
Console.WriteLine(str);
但是,它可能比以前发布的解决方案表现更差。他们使用.Any()
的{{1}}方法,在找到第一个匹配的第一个名字后停止,而无论如何我继续通过所有Joes,Bobs和Mikes。