在包含字符串数组值的列表中查找所有元素
本文关键字:查找 元素 列表 包含 字符串 数组 | 更新日期: 2023-09-27 17:52:42
如果数组中有两个元素;
FirstName,LastName,Company
Donald,Duck,Disney
Daffey,Duck,Warner Brothers
现在我的用户输入"d",我应该得到两个记录。
现在我的用户输入"duck",我应该再次得到两个记录。
现在我的用户输入"duck disn",我应该只得到第一个记录。
在linq中有办法做到这一点吗?
编辑
我尝试了一些东西,最新的是这个;
var searchTerms = searchText.Split(" ".ToCharArray());
enquiryList = enquiryList.Where(x =>
searchTerms.Contains(x.CompanyName.ToLower()) ||
searchTerms.Contains(x.FirstName.ToLower()) ||
searchTerms.Contains(x.LastName.ToLower())).ToList();
但这只适用于我输入完整的单词,如disney,而不是部分的单词,如dis
var searchParts = searchText.Split(' ');
var matcheds = enquiryList.Where(enquiry =>
{
var texts = new[] { enquiry.FirstName, enquiry.LastName, enquiry.Company };
return searchParts.All(part => texts.Any(text =>
text.IndexOf(part, StringComparison.OrdinalIgnoreCase) >= 0));
});
清空你的大脑。LINQ很简单。
您想要在FirstName
, LastName
或Company
的Any
中找到All
搜索词的项
听起来您想在所有三个字段中搜索匹配的字符串。
假设您有一个名为Person
的类,它具有三个属性(FirstName,LastName,Company
),您可以这样做。
var splits = searchText.Trim().Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);
persons.Where(p=> splits.All(x=>
p.FirstName.IndexOf(x, StringComparison.OrdinalIgnoreCase) >=0
|| p.LastName.IndexOf(x, StringComparison.OrdinalIgnoreCase) >=0
|| p.Company.IndexOf(x, StringComparison.OrdinalIgnoreCase) >=0));
工作Example
这涵盖了所有的情况:
string[] searchWords = new string[] { "duck", "disn" };
List<Duck> myList = new List<Duck>()
{
new Duck() { FirstName = "Donald", LastName = "Duck", Company = "Disney" },
new Duck() { FirstName = "Daffey", LastName = "Duck", Company = "Warner Brothers" }
};
var duckResults2 = (from duck in myList
where searchWords.All
(searchStr =>
duck.FirstName.IndexOf(searchStr, StringComparison.OrdinalIgnoreCase) >= 0 ||
duck.LastName.IndexOf(searchStr, StringComparison.OrdinalIgnoreCase) >= 0 ||
duck.Company.IndexOf(searchStr, StringComparison.OrdinalIgnoreCase) >= 0)
select duck).ToList();