在 C# 中,如何使用另一个列表的 StartsWith() 条件过滤列表?
In C#, how can I filter a list using a StartsWith() condition of another list?
假设我有一个字符串列表:
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 是否存在于搜索列表中来过滤它,但我没有进行直接匹配,而是 "starts with" 匹配。所以在我的例子中,过滤后我希望这是结果
"Joe Thompson"
"Bob Jones"
"Bob Smith"
"Joe Williams"
(如您所见,以 Billy 开头的记录未包含在内,因为它未在搜索列表中以任何项目开头)
我可以这样做 "manually" 像这样:
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 代码中执行单个字符串?
var resultList = fullNameList.Where(r => searchList.Any(f=>r.StartsWith(f)));
类似于:
fullNameList.Where(c=>searchList.Any(f=>c.StartsWith(f)))
以下 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);
但是,它的性能可能比以前发布的解决方案差。他们使用 IEnumerable<T>
的 .Any()
方法,它会在找到任何家伙的第一个匹配名字后停止,而我的方法会继续遍历所有 Joes、Bobs 和 Mikes。
假设我有一个字符串列表:
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 是否存在于搜索列表中来过滤它,但我没有进行直接匹配,而是 "starts with" 匹配。所以在我的例子中,过滤后我希望这是结果
"Joe Thompson"
"Bob Jones"
"Bob Smith"
"Joe Williams"
(如您所见,以 Billy 开头的记录未包含在内,因为它未在搜索列表中以任何项目开头)
我可以这样做 "manually" 像这样:
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 代码中执行单个字符串?
var resultList = fullNameList.Where(r => searchList.Any(f=>r.StartsWith(f)));
类似于:
fullNameList.Where(c=>searchList.Any(f=>c.StartsWith(f)))
以下 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);
但是,它的性能可能比以前发布的解决方案差。他们使用 IEnumerable<T>
的 .Any()
方法,它会在找到任何家伙的第一个匹配名字后停止,而我的方法会继续遍历所有 Joes、Bobs 和 Mikes。