如果我有一个 List<T>,在遍历列表时使用 IEnumerable<T> 有什么好处吗?
If I have a List<T>, is there any advantage of using an IEnumerable<T> when looping through the list?
在 C# 中,如果我有一个存储在对象中的 List<T>
,并且我想检查列表中是否存在某个值,调用 [=19] 的函数是否有任何优势=] 一个 IEnumerable<T>
而不是循环遍历我已经拥有的 List<T>
?
谢谢。
当您 return 将 属性 作为 IEnumerable<T>
时,这会告诉调用者您不能改变它的值,您可以迭代它,这可以帮助您获得摆脱了很多意想不到的错误。
如果你将 属性 公开为 List<T>
,它很容易被 "others" 变异,这会导致大型系统混乱,所以保持你的数据不可变可能。
图像你正在跟踪一个错误,因为列表中的项目不是当前的,如果 属性 作为列表公开,你必须查看 属性 的所有用法才能看到谁改变了它,但是如果你将它公开为 Iemumerable,你可以确定唯一改变它的地方是它自己的对象,这将为你节省大量时间来跟踪错误。
List 是一个可变集合 - 您可以添加、删除和排序等。它很灵活,但 IEnumerable 允许您使用相同的代码来处理数组、链表、列表、返回的迭代器的任何实现来自使用 yield 语句的方法。
您有一个正在描述的读取操作。 Return 你的 IList<T>
作为 IEnumerable<T>
。
然后,使用 linq 的 Contains()
- 它在内部检查 ICollection
的实现并优化使用可用的实现,尽管它接受 IEnumerable<T>
。换句话说,返回 IEnumerable<T>
不会有任何损失。
在 C# 中,如果我有一个存储在对象中的 List<T>
,并且我想检查列表中是否存在某个值,调用 [=19] 的函数是否有任何优势=] 一个 IEnumerable<T>
而不是循环遍历我已经拥有的 List<T>
?
谢谢。
当您 return 将 属性 作为 IEnumerable<T>
时,这会告诉调用者您不能改变它的值,您可以迭代它,这可以帮助您获得摆脱了很多意想不到的错误。
如果你将 属性 公开为 List<T>
,它很容易被 "others" 变异,这会导致大型系统混乱,所以保持你的数据不可变可能。
图像你正在跟踪一个错误,因为列表中的项目不是当前的,如果 属性 作为列表公开,你必须查看 属性 的所有用法才能看到谁改变了它,但是如果你将它公开为 Iemumerable,你可以确定唯一改变它的地方是它自己的对象,这将为你节省大量时间来跟踪错误。
List 是一个可变集合 - 您可以添加、删除和排序等。它很灵活,但 IEnumerable 允许您使用相同的代码来处理数组、链表、列表、返回的迭代器的任何实现来自使用 yield 语句的方法。
您有一个正在描述的读取操作。 Return 你的 IList<T>
作为 IEnumerable<T>
。
然后,使用 linq 的 Contains()
- 它在内部检查 ICollection
的实现并优化使用可用的实现,尽管它接受 IEnumerable<T>
。换句话说,返回 IEnumerable<T>
不会有任何损失。