【问题标题】:C# Generic List - FindAll on child ArraysC# 通用列表 - 子数组上的 FindAll
【发布时间】:2010-01-21 17:37:42
【问题描述】:

我正在尝试找到使用 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。 所以我真正想要的是为分配到某个区域的任何产品过滤产品列表。

【问题讨论】:

  • 为什么不能将Nicknames 设为数组或列表?
  • 据我所知,“昵称”不是一个数组,而是一个字符串。

标签: c# arrays list generics findall


【解决方案1】:

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

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

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

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

在上述两种情况下,您都可以将 Where 替换为 FindAll 并在 List&lt;T&gt; 而不是 IEnumerable&lt;T&gt; 中返回结果(List&lt;T&gt;.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"));

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多