在包含字符串数组值的列表中查找所有元素

本文关键字:查找 元素 列表 包含 字符串 数组 | 更新日期: 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, LastNameCompanyAny中找到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();