糖衣阵列(动态调整大小并随意设置任何元素)

Dan*_*n W 1 .net c# arrays list syntactic-sugar

我想要我的蛋糕并吃掉它.

当你超越数组的初始容量时,我喜欢C#中Lists的动态扩展方式.但这还不够.我希望能够做到这样的事情:

int[] n = new int[];    // Note how I'm NOT defining how big the array is.
n[5] = 9
Run Code Online (Sandbox Code Playgroud)

是的,速度会有一些牺牲,因为在幕后,.NET需要检查是否已超出默认容量.如果有,则可以将阵列扩展5倍左右.

遗憾的是,对于Lists,你并不是真的想要设置一个任意元素,虽然你可以这样做,但是如果没有初步设置List的大小,仍然无法直接设置say,第五个元素,更不用说让它在尝试时动态扩展.

对于任何解决方案,我希望能够保持简单的方括号语法(而不是使用相对详细的方法调用),并且当它不扩展时,它具有相对快速(最好与标准数组一样快)阵列.

Joe*_*orn 5

请注意,我不一定主张继承List,但如果你真的想要这样:

public class MyList<T> : List<T>
{
    public T this[int i]
    {
        get { 
            while (i >= this.Count) this.Add(default(T));
            return base[i]; 
        }
        set { 
            while (i >= this.Count) this.Add(default(T));
            base[i] = value; 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我要补充一点,如果你期望你的"数组"的大多数值在你的程序生命周期内保持空白,那么通过使用a Dictionary<int, T>,你将获得更高的效率,特别是当集合的大小变大时.

  • `List <T>`没有`Length`属性.我想你想要'伯爵'. (3认同)
  • 关于你的第一句,供参考:[为什么不继承`List <T>`?](http://stackoverflow.com/questions/21692193/why-not-inherit-from-listt) (2认同)
  • @JamesThorpe这实际上是从列表继承有意义的少数情况之一.您正在扩展收集功能. (2认同)
  • @DanW我认为它可能需要是`i> = this.Count`? (2认同)