1

我正在尝试找到使用 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 个或多个区域。区域对象具有名称和 ID。所以我真正想要的是为分配给某个地区的任何产品过滤产品列表。

4

2 回答 2

3

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

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

如果您想保持原样(字符串),您可以尝试以下方式:

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

在上述两种情况下,您都可以用a而不是 a (从 2.0 开始存在,但在 3.5 中是新的)Where替换并返回结果。FindAllList<T>IEnumerable<T>List<T>.FindAllEnumerable.Where

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

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"));
于 2010-01-21T17:46:46.003 回答
0

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

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

编辑:忘记单引号......和> =

于 2010-01-21T17:54:37.847 回答