转换为 IList 然后在 null 时调用 ToList() 是否比普通 ToList() 更好?
Is casting to IList and then calling ToList() when null better than plain ToList()?
当我有一个 IEnumerable<SomeClass>
时,我不知道它是否是一个列表(根据 List<T>
),我必须枚举那个 IEnumerable
到确保我没有枚举那个可枚举的两次(例如循环两次,或类似的东西)。
Resharper 警告我可能对 IEnumerable 进行多重枚举 - 这很好,有时你会忘记 - 并允许你选择快速修复:
- 枚举到数组
- 枚举到列表
当我选择 Enumerate 列出时,resharper 引入了一个局部变量,并按以下方式分配 IEnumerable(示例):
var enumeratedItems = items as IList<SomeClass> ?? items.ToList();
现在我的问题是:
为什么它不直接执行 items.ToList();
?
首先尝试转换为 IList<SomeClass>
有什么好处?
也许 IEnumerable
已经是一个列表,在这种情况下调用 ToList()
只会从现有列表创建一个新列表,所以在这样做之前 resharper 建议先尝试将其转换为检查它是否是 IList
,只有在不是的情况下,我们才会执行具有一定成本的 ToList()
操作。
当我有一个 IEnumerable<SomeClass>
时,我不知道它是否是一个列表(根据 List<T>
),我必须枚举那个 IEnumerable
到确保我没有枚举那个可枚举的两次(例如循环两次,或类似的东西)。
Resharper 警告我可能对 IEnumerable 进行多重枚举 - 这很好,有时你会忘记 - 并允许你选择快速修复:
- 枚举到数组
- 枚举到列表
当我选择 Enumerate 列出时,resharper 引入了一个局部变量,并按以下方式分配 IEnumerable(示例):
var enumeratedItems = items as IList<SomeClass> ?? items.ToList();
现在我的问题是:
为什么它不直接执行 items.ToList();
?
首先尝试转换为 IList<SomeClass>
有什么好处?
也许 IEnumerable
已经是一个列表,在这种情况下调用 ToList()
只会从现有列表创建一个新列表,所以在这样做之前 resharper 建议先尝试将其转换为检查它是否是 IList
,只有在不是的情况下,我们才会执行具有一定成本的 ToList()
操作。