【问题标题】:Lambda for nested arrays用于嵌套数组的 Lambda
【发布时间】:2011-02-19 17:13:23
【问题描述】:

我有一个自定义对象列表:

List<SomeObject> someobjects = getAllSomeObjects();
List<SomeObject> someobjectsfiltered = new List<SomeObject>();

class SomeObject
{
  List <AnotherList>
}

class AnotherList
{
  public string Name{get;set;}
  public Categories category {get;set;}
}

所以我正在尝试使用 Lambda 获取特定类型的 All AnotherList 项目

someobjectsfiltered = someobjects.SelectMany(s => s.AnotherList.FindAll(a => a.category == SomeCategory));

但我明白了

不能隐式转换类型 IEnumerable 到 Generic.List

错误

知道如何解决这个问题吗?

非常感谢。

【问题讨论】:

    标签: c# .net arrays .net-4.0 lambda


    【解决方案1】:

    您需要在最后抛出ToList() 或将结果类型更改为IEnumerable&lt;SomeObject&gt;,因为正如错误所说,您不能将IEnumerable&lt;T&gt; 分配给List&lt;T&gt; 类型的变量。

    someobjectsfiltered = someobjects.SelectMany(s => s.AnotherList.FindAll(a => a.category == SomeCategory))
                                     .ToList();
    

    基于 cmets 编辑

    如果您想要的是SomeObjects,它有一个列表,其中包含与您可以使用的类别匹配的项目。

    someobjectsfiltered = someobjects.Where( s => s.AnotherList.Any( a => a.category == SomeCategory ))
                                     .ToList();
    

    【讨论】:

    • @adam-rackis 非常感谢你工作得很好,出于兴趣,我可以在这里使用 FindAll().FindAll() 代替 SelectMany().FindAll() 吗?
    • @Maya - 我不这么认为。 SelectMany 进行投影和连接,而 FindAll 进行过滤。这就像试图用where 子句替换select
    • 道歉@tvanfosson,我已经测试了 ToList() 解决方案,如果 someobjectsfiltered 是 AnotherList 的类型,它工作正常,但我针对我上面的原始代码测试了它,其中 someobjectsfiltered 是 SomeObject 的列表,并且给出错误无法将 List 转换为 List。在发表评论之前,我可能应该根据上面的确切代码对其进行测试。
    • @Maya - 我误解了你想要做什么。我以为您正在尝试获取具有匹配类别的 AnotherList 对象。您是否正在尝试获取其列表包含具有匹配类别的项目的 SomeObjects?那将是不同的。我会将其添加到我的答案中。如果确实是前者,那么过滤后的列表必须是 List&lt;AnotherList&gt; 类型(顺便说一下,这是一个非常容易误导的类名)。
    • 是的,这正是我想要做的(你最初的回答虽然帮助我解决了另一个问题)。现在一切正常,我为示例中的误导性名称道歉,在发布之前我没有很好地掩盖实际的敏感名称,再次感谢:)
    【解决方案2】:

    @tvanfosson @Maya 不确定“Any”如何在这里工作,因为如果“Category”类型在内部列表,则将选择其所有内容,包括具有不需要的类别类型的内容。

    【讨论】:

    【解决方案3】:

    SelectMany 返回IEnumerable&lt;T&gt; - 您只需在末尾添加对ToList() 的调用即可将其转换为List&lt;T&gt;

    someobjectsfiltered = someobjects.SelectMany(s => s.AnotherList.FindAll(a => a.category == SomeCategory)).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 2020-11-20
      • 2015-10-03
      • 2019-03-30
      • 1970-01-01
      相关资源
      最近更新 更多