如果我有一个IEnumerable<SomeClass>
,我不知道它是否列出了一个列表(就List<T>
而言),我必须列举IEnumerable
来确保我没有枚举两次可枚举(例如循环两次,或类似的东西)。
Resharper警告我可能多次枚举IEnumerable - 这很好,有时你会忘记它 - 并允许你选择quickfixes:
当我选择Enumerate列表时,resharper引入了一个局部变量,并按以下方式分配IEnumerable(例子):
var enumeratedItems = items as IList<SomeClass> ?? items.ToList();
现在我的问题是:
为什么不只是items.ToList();
?
首先尝试转换为IList<SomeClass>
有什么好处?
答案 0 :(得分:8)
也许IEnumerable
已经是一个列表,在这种情况下,调用ToList()
只会从现有的列表中创建一个新的列表,所以在执行之前,resharper建议先尝试先将其转换为检查是否它是IList
或不是,只有在它没有的情况下,我们才会执行有一些成本的ToList()
操作。