2012-06-01 40 views
1

说我有下面的代码:可以订购动态类型吗?

dynamic myData = GetMyData(); 
foreach(dynamic d in myData.data) 
{ 
    Console.WriteLine(d.name); 
} 

我怎么能WriteOut的所有名字的字母顺序?如果我正在使用类似List<MyClass>的东西,我只会使用myData.OrderBy(t => t.name),但在使用动态类型时似乎不起作用。

有关如何订购这些值的任何建议?

+2

为什么你使用动态? var myData = GetMyData()。OrderBy(t => t.name);'? –

+1

我使用的是Facebook C#SDK,他们给出的例子都使用'dynamic'。这是我第一次接触“动态”类型,所以我不能聪明地说出为什么或为什么不应该在这种情况下使用它们。说实话,我不太确定动态和匿名类型的差异,但这是一个完全不同的职位。我打算再研究一下这个问题,但现在我只想知道这是否可以完成。如果没有,没什么大不了的。 [扩展方法和在c#动态对象]的 –

+0

可能重复(http://stackoverflow.com/questions/5311465/extension-method-and-dynamic-object-in-c-sharp) – nawfal

回答

7
Enumerable.OrderBy(myData, (Func<dynamic, dynamic>)(t => t.name)); 

这应该返回相同的myData.OrderBy(t => t.name)通常会。

由于OrderBy是一个扩展的方法,它不会在动态类型工作。见this answer

+1

导致此错误:“不能使用lambda表达式作为动态调度操作的参数,而无需先将其转换为委托或表达式树型” –

+1

我添加了一个强制转换。看看它是否有帮助。 –

+0

现在它给出了一个'RuntimeBinder'异常:“对于最佳重载方法匹配 'System.Linq.Enumerable.OrderBy <对象,对象>(System.Collections.Generic.IEnumerable ,System.Func <对象,对象>)'有一些无效的参数“ –

3

这可能会为你工作:

IEnumerable<dynamic> sequence = Enumerable.Cast<dynamic>(myData); 
foreach (var result in sequence.OrderBy(x => x.name)) 
{ 
    Console.WriteLine(result.name); 
} 

基本上调用Cast<dynamic>并转换为IEnumerable<dynamic>后,你可以做你喜欢什么样的序列,而不是单个值。

不是我实际上试过以上,但我相信它应该工作。

+0

这不工作,以及正在尝试 –