首页 > 解决方案 > IEnumerable 和 OrderBy 的奇怪之处

问题描述

我有一段代码看起来很简单,但似乎并非如此。

// Enum values
IEnumerable values = Enum.GetValues(typeof(TVal)).Cast<TVal>();

// Sort them by alpha
if (sortByAlpha)
{
    values = (values).OrderBy(i => i.ToString());
}

如果我写:

// Get enum values
IEnumerable values = Enum.GetValues(typeof(TVal)).Cast<TVal>();

// Sort them by alpha
if (sortByAlpha)
{
    values = Enum.GetValues(typeof(TVal)).Cast<TVal>().OrderBy(i => i.ToString());
}

有用。

为什么?第一段代码中的值应该相同吗?我没有看到什么?在 .Net 4.5.1 上运行它

标签: c#.netlinqvisual-studio-2015ienumerable

解决方案


剪断的第一个代码不会编译,因为OrderBy是 的扩展方法IEnumerable<T>,但您正在使用IEnumerable.

因此,为了使其编译,更改您的第一个片段并执行以下操作:

IEnumerable<TVal> values = Enum.GetValues(typeof(TVal)).Cast<TVal>();

// Sort them by alpha
if (sortByAlpha)
{
     values = values.OrderBy(i => i.ToString());
 }

IEnumerable和之间的区别在于IEnumerable<T>后者基本上是一个更专业的版本,它知道它处理哪些元素。

例如,这就是 Cast 方法所做的,它将非特定的IEnumerable转换为IEnumerable<T>使您能够在第二个示例中使用该 OrderBy。

我建议你在谷歌上搜索一下这个主题。


推荐阅读