C#Generic List - 关于子数组的FindAll

时间:2010-01-21 17:37:43

标签: c# arrays list generics findall

我正在尝试找到使用C#(3.5)过滤列表的最佳方法,但我似乎无法找到任何与我的情况类似的示例。我愿意使用lambdas或linq。

与我发现的大多数示例相比,这是唯一的事情,就是我的列表项每个都有子数组,例如......

var employees= new List<Employee>
{
    new Employee{Name = "John",Nicknames="'J','Big J','Big John'"},
    new Employee{Name = "Joshua",Nicknames="'J','Josh','Joshman'"},
}

然后,我想过滤一下这样的列表...

//using linq
var matchesByNickname =
from worker in employees
where worker.Nicknames.Equals("J")
select worker;

//or lambda
var employees2 = employees
    .Where(e => Nicknames.Exists(n => n.Nickname == "J"))

但是当然,因为Nicknames本身就是一个我不能使用的数组.Equals或.Contains等。过滤这种类型列表的最佳方法是什么?

更新: 为了让我的例子变得简单,我误导了你一点。列表项上有真正的对象数组,而不是字符串。我的真实世界示例是自定义产品对象的列表。 product对象上有一个Regions属性,它是Region对象的列表。产品可以没有,1个或多于1个区域。 region对象具有名称和id。 因此,我真正想要的是过滤产品列表,以及分配到特定区域的任何产品。

2 个答案:

答案 0 :(得分:3)

在您的示例中,Nickname不是我看到的数组。这是一个字符串。假设它是一个字符串数组,你可以:

var employees2 = employees.Where(e => e.Nicknames.Contains(name));

如果你想保持原样(字符串),你可以尝试以下几点:

var employees2 = employees.Where(e => e.Nicknames.Split(',')
                                                 .Contains("'" + name + "'"));

在上述两种情况下,您都可以将Where替换为FindAll并将结果返回到List<T>而不是IEnumerable<T>List<T>.FindAll自2.0以来一直存在,但Enumerable.Where是3.5中的新功能。

当然,理想情况下,您将使其成为如下所示的数组或列表,并使用第一种方法:

var employees = new List<Employee>
{
    new Employee{Name = "John",Nicknames= new [] {"J", "Big J", "Big John"}},
    new Employee{Name = "Joshua",Nicknames = new [] {"J", "Josh", "Joshman"}},
};

更新:您的真实示例与此示例案例没有太大区别。我认为你正在寻找Any而不是Contains,因为你正在检查一个属性,而不是整个对象是否相等:

var filteredProducts = products
        .Where(p => p.Regions.Any(r => r.Name == "regionToSearchFor"));

答案 1 :(得分:0)

如果昵称周围有单引号,您可以查看单引号的字符串。

employees.Where(x=>x.Nicknames.IndexOf("'J'") >= 0)

编辑:忘记单引号...和&gt; =