将索引编入
的最佳方法是什么IEnumerable<T>
我们有很多代码正在从
转移 IList<T>
我们希望将它们更改为:
IEnumerable<T>
因为我们希望它们是只读的,但我们有许多代码,如:
item.Dates[0]
或
item.Dates[i]
(在一个循环中)。
这里推荐的转换路径是什么?
答案 0 :(得分:6)
获得你所追求的最快最肮脏的方法是使用ReadOnlyCollection<T>
课程。这可以作为IList<T>
实现公开(因此您可以根据需要通过索引进行随机访问)但实际上是只读的(因此通常会更改集合的方法 - 例如Add
,{ {1}}等等 - 反而抛出异常。)
您也可以设计自己的界面,something like IArray<T>
继承自Insert
,并且仅展示IEnumerable<T>
getter 。
但是你需要为此编写一个包装器才能使它完全有用。不幸的事实是,很多代码只与this[int index]
接口进行交互,只能进行随机访问(不可变),因此使用它可能是阻力最小的路径。
答案 1 :(得分:3)
如果您想要一个带有索引器的集合,但需要只读的内容,请使用ReadOnlyCollection<T>
。
答案 2 :(得分:0)
使用LINQ表达式或foreach循环。索引可能会导致许多错误和草率代码。
否则,在IEnumerable上执行ToArray然后索引。
IEnumerable就是一个支持枚举的对象。它不一定支持索引,因此您无法索引对象。
示例,使用IEnumerable:
//item.Dates[0];
item.Dates.FirstOrDefault();
//item.Dates[i] in a loop
item.Dates.Select(/*some projection*/);
//or
foreach (var date in item.Dates)
{
//some action with side effects
}