IEnumerable 和 OrderBy 的奇怪之处

Strangeness with IEnumerable and 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 上

截取的第一个代码无法编译,因为 OrderByIEnumerable<T> 的扩展方法,但您正在使用 IEnumerable

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

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

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

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

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

我建议你用谷歌搜索一下这个话题。

另一个回复已经很好地解释了哪里出了问题,但我想澄清一下您的代码为什么会出错。要从这里开始,请输入您的代码:

// Enum values
IEnumerable values = Enum.GetValues(typeof(TVal)).Cast<TVal>();
//   ^---- This is where it's going wrong

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

Cast<TVal>() returns 和 IEnumerable<TVal>,但是因为你将它保存为 IEnumerable,所以你隐含地转换了它。这类似于做:

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

这是完全有效的,因为 IEnumerable<T> 继承自 IEnumerable,因此转换有效,但您失去了 IEnumerable<T> 提供的 IEnumerable 的所有功能。其中之一是 OrderBy 方法。