【问题标题】:IEnumerable<dynamic> linq expressionsIEnumerable<dynamic> linq 表达式
【发布时间】:2011-03-21 11:21:36
【问题描述】:

我有动态的客户列表IEnumerable&lt;Customer&gt;

现在我想从该列表中获得不同的公司名称?

我想我可以做类似的事情

 dynamic cur = (from c in result.Customers
                      select g.CompanyName).Distinct();

但今天得知我不能... 如何构建这样的查询?

【问题讨论】:

    标签: c# dynamic c#-4.0 linq-to-objects


    【解决方案1】:

    您在代码中所做的事情和您在问题标题中提出的问题是两件不同的事情。

    如果您想要IEnumerable&lt;dynamic&gt;,您必须执行以下操作:

    IEnumerable<dynamic> cur = (from c in result.Customers
                   select g.CompanyName).Cast<dynamic>().Distinct();
    

    from c in result.Customers select g.CompanyName 返回 IEnumerable&lt;string&gt;
    Cast&lt;dynamic&gt;() 返回 IEnumerable&lt;dynamic&gt;
    Distinct() 返回可枚举的不同成员。

    Distinct() 默认使用默认相等比较器EqualityComparer<T>。这会检查被枚举的类型并尝试找出如何处理它(链接对此进行了详细描述)。

    这一切都像宣传的那样工作,除非动态处理的类型不能由默认的相等比较器处理。在这种情况下,您必须使用采用自定义相等比较器的覆盖。

    【讨论】:

    • 很好的解释。并感谢您的链接。
    【解决方案2】:

    只要Customer类有成员CompanyName,你绝对可以做到以下几点:

    var companies = (from c in result.Customers
                     select c.CompanyName).Distinct();
    

    在这里使用dynamic 关键字比var 没有任何优势,除了它可以防止出现编译器错误。

    【讨论】:

    • 不能这样做:不允许使用源类型“动态”或具有“动态”类型的连接序列的查询表达式
    • 我认为您需要提供更多上下文。 result 是什么? result.Customers 是什么?
    • 我的错我返回了一个动态而不是一个 IEnumerable 这就是为什么我得到了例外......这都是动态的叹息......无论如何谢谢......也谢谢@will他的.Cast() 让我思考......但它不像@jdmichal 描述的那样工作,谢谢......
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多