我该怎么转换呢?

时间:2010-12-17 19:07:16

标签: c# ienumerable

将索引编入

的最佳方法是什么
IEnumerable<T>

我们有很多代码正在从

转移
 IList<T>

我们希望将它们更改为:

IEnumerable<T>

因为我们希望它们是只读的,但我们有许多代码,如:

item.Dates[0]

item.Dates[i]

(在一个循环中)。

这里推荐的转换路径是什么?

3 个答案:

答案 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
}
相关问题