c# - 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。
我建议你在谷歌上搜索一下这个主题。
推荐阅读
- android - 未找到默认活动 - 出现在我以前工作的所有项目中
- c# - 计算具有相同值的 DataGridView 的单元格并显示结果
- twilio - Twilio 的功能 - 是否有可用的 npm 模块列表
- binaryfiles - 文件格式规范
- laravel - 使用 Laravel Helpers Arr::add() 存储数据 - Laravel 5.6
- spring - 如何在 nginx 中添加过滤器或中间件
- php - 会话变量在不同页面上显示为空
- go - 如何运行以下 Golang MCTS 示例?
- python - python系统中导入多个csv文件的问题
- c# - C# - 尝试启动位于服务器上的 exe