转换为 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() 操作。