Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有IEnumerable和OrderBy的陌生度_C#_.net_Linq_Visual Studio 2015_Ienumerable - Fatal编程技术网

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>();