IEnumerable <dynamic> linq表达式</dynamic>

时间:2011-03-21 11:21:37

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

我有动态的客户列表IEnumerable<Customer>

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

我以为我可以做点什么

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

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

2 个答案:

答案 0 :(得分:5)

您在代码中所做的事情以及您在问题标题中提出的问题是两回事。

如果您需要IEnumerable<dynamic>,则必须执行以下操作:

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

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

默认情况下,

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

除非默认的相等比较器无法处理动态处理的类型,否则这一切都与广告一样有效。在这种情况下,您将必须使用带有自定义相等比较器的覆盖。

答案 1 :(得分:4)

只要Customer类有成员CompanyName,您就可以执行以下操作:

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

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