C# 带有IEnumerable和OrderBy的陌生度
我有一段代码,看起来很简单,但似乎不是C# 带有IEnumerable和OrderBy的陌生度,c#,.net,linq,visual-studio-2015,ienumerable,C#,.net,Linq,Visual Studio 2015,Ienumerable,我有一段代码,看起来很简单,但似乎不是 // Enum values IEnumerable values = Enum.GetValues(typeof(TVal)).Cast<TVal>(); // Sort them by alpha if (sortByAlpha) { values = (values).OrderBy(i => i.ToString()); } //枚举值 IEnumerable values=Enum.GetValues(typeof(
// Enum values
IEnumerable values = Enum.GetValues(typeof(TVal)).Cast<TVal>();
// Sort them by alpha
if (sortByAlpha)
{
values = (values).OrderBy(i => i.ToString());
}
//枚举值
IEnumerable values=Enum.GetValues(typeof(TVal)).Cast();
//按字母排序
if(Sortbyapha)
{
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());
}
//获取枚举值
IEnumerable values=Enum.GetValues(typeof(TVal)).Cast();
//按字母排序
if(Sortbyapha)
{
values=Enum.GetValues(typeof(TVal)).Cast().OrderBy(i=>i.ToString());
}
它起作用了
为什么??第一段代码中的值应该相同吗?
我没有看到什么?
在.Net 4.5.1上运行此操作时,第一个被剪断的代码不会编译,因为这是
IEnumerable
的扩展方法,但您使用的是IEnumerable
因此,为了使其可编译,请更改第一个代码段并执行以下操作:
IEnumerable<TVal> values = Enum.GetValues(typeof(TVal)).Cast<TVal>();
// Sort them by alpha
if (sortByAlpha)
{
values = values.OrderBy(i => i.ToString());
}
IEnumerable values=Enum.GetValues(typeof(TVal)).Cast();
//按字母排序
if(Sortbyapha)
{
values=values.OrderBy(i=>i.ToString());
}
IEnumerable
和IEnumerable
之间的区别在于后者基本上是一个更专门的版本,知道它处理什么元素
例如,Cast方法就是这样做的,它将非特定的IEnumerable
转换为IEnumerable
,使您能够在第二个示例中使用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());
}
这是完全有效的,因为
IEnumerable
继承自IEnumerable
,因此强制转换可以工作,但您失去了IEnumerable
提供的所有功能。其中一个是OrderBy
方法。它可以工作,你的意思是,它可以编译var
是一个很好的关键词。用它,我怎么没看到?有时,您需要在一段代码上花很长时间才能看到最符合逻辑的东西。谢谢你的帮助
IEnumerable values = (IEnumerable) Enum.GetValues(typeof(TVal)).Cast<TVal>();