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 上
截取的第一个代码无法编译,因为 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。
我建议你用谷歌搜索一下这个话题。
另一个回复已经很好地解释了哪里出了问题,但我想澄清一下您的代码为什么会出错。要从这里开始,请输入您的代码:
// 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
方法。
我有一段代码,看似简单,实则不然。
// 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 上
截取的第一个代码无法编译,因为 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。
我建议你用谷歌搜索一下这个话题。
另一个回复已经很好地解释了哪里出了问题,但我想澄清一下您的代码为什么会出错。要从这里开始,请输入您的代码:
// 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
方法。