如何根据linq中的两个属性过滤数据

时间:2021-04-28 17:10:51

标签: c# linq

我有一个包含如下数据的列表:

Name | LName
------------
John| Snow
Raymond | Redington
....

我可以用下面的代码在每一列中搜索

list.ShapeView().Where(p =>
                         (p.Name.IndexOf(autoBox.Text, StringComparison.OrdinalIgnoreCase) != -1) ||
                         (p.LName.IndexOf(autoBox.Text, StringComparison.OrdinalIgnoreCase) != -1)).Apply();
    

如果我输入以下文本,结果将被正确过滤

  • 约翰

但是如果我同时输入它们

  • 约翰·斯诺

不会显示任何结果,我该如何实现?

2 个答案:

答案 0 :(得分:2)

您想支持什么并不是 100% 清楚。如果您还希望 TextBox.Text 的一部分必须包含在 NameLName 中,那么这应该可行:

var query = list.ShapeView()
    .Where(p => autoBox.Text.IndexOf(p.Name, StringComparison.OrdinalIgnoreCase)  != -1
            ||  autoBox.Text.IndexOf(p.LName, StringComparison.OrdinalIgnoreCase) != -1
            ||  p.Name.IndexOf(autoBox.Text, StringComparison.OrdinalIgnoreCase)  != -1                         
            ||  p.LName.IndexOf(autoBox.Text, StringComparison.OrdinalIgnoreCase) != -1);

您还可以按空格拆分并在 name 中搜索第一个标记,在 lname 中搜索第二个标记。但这也坏了,如果有人输入“John Lee Hooker”怎么办?什么是名字,什么是姓氏?所以你应该有两个文本框。

答案 1 :(得分:1)

您可以将 Split 应用于文本并使用 function Contains

示例:

string[] valores = autoBox.Text.ToUpper().Split(' ');

var query = list.ShapeView()
    .Where(p =>valores.Contains(p.Name.ToUpper())||valores.Contains(p.LName.ToUpper()));
相关问题