在不使用.Add()的情况下动态添加项目到列表按索引

我试图在没有动态使用.Add()的情况下将项目添加到列表中。请注意,由于项目的性质,我无法使用替代数据结构,如字典或简单数组甚至是HashSet。 我需要一个解决方案来解决以下问题,因为它是:

List initA = new List(); for (int i = 0; i < m; i++) initA[i] = i; 

更新:但是,如果有人建议我更好的数据结构来实现以下想法,那么我可以使用它作为替代:

我设置了这样的A例如:

 A[0] = (1,2,3,4,5...) A[1] = (10,20,30,40 ...) 

我需要直接访问:A [0] [1] = 2,A [1] [3] = 40我不知道内部数组的大小(设置元素的实际大小)这就是为什么我将此集实现为列表数组,因为我不知道它的大小,所以我不能将Jagged Array用于内部数组。 set元素在运行时添加。

有关解决第一期的任何建议吗? 甚至建议取代代表这样一套的策略?

请注意,我需要有效的数据结构,因为A将存储> 1M套。

这在C ++中是非常容易的任务,你可以使用指针…实际上这是我解决问题的方法,因为在C#中使用不安全的代码存在风险

你可以使用Dictionary来解决:

用法:

 Vector v = new Vector(); v[0] = "item0"; v[10] = "item10"; string s = v[10]; //s will be "item10" 

码:

 class Vector { Dictionary list; public Vector () { this.list = new Dictionary(); } public T this [int index]{ get { if (list.ContainsKey(index)) return list[index]; else return default(T); } set { if (list.ContainsKey(index)) list[index] = value; else list.Add(index,value); } } } 

你不能。

列表数据结构仅允许您使用Add方法(或类似方法,例如AddRange )添加项目。 索引器只能用于修改特定位置的条目。 它不能用于将条目添加到最初为空的列表。

因此,您必须先填写列表,然后才能修改特定位置的项目,例如:

 List initA = new List(new int[m]); for (int i = 0; i < m; i++) initA[i] = i; 

请注意,第一行相当于在循环中添加m零,因此,从技术上讲,您没有避免“添加”项目。

显然你做不到。 列表是具体行为的具体对象,不能简单地改变。 一个肮脏的解决方法是使用默认值预分配列表:

 var l = new List(Enumerable.Repeat(0, numberOfValuesINeed)); 

甚至:

 var l = new List(Enumerable.Repeat((int?)null, numberOfValuesINeed)); 

因此,您可以确定哪些值尚未分配。

一个更好的选择是实现自己的IList (使用List作为内部存储将使得它非常简单,如果你不介意潜在的O(n)插入)。

但这都是语法糖,所以我要么按预期使用语言,要么使用提供所需动态行为的不同语言。 我无法想到这些约束适用的无学术情景。

如果索引非常重要,则必须确保该索引处的元素实际存在或可以添加。

 List initA = new List(); for (int i = 0; i < m; i++) initA.SetValueAtIndex(i, i); public static void SetValueAtIndex(this IList list, int index, T value) { while (list.Count <= index + 1) { list.Add(default(T)); } list[index] = value; } 

这些代码的弱点是.Add(default(T))部分。 它添加了实际数据未知的项目。 这不是你的问题,不介意。 另一个问题是你可以传入一个高数字作为索引,这会导致一个巨大的列表。 如果是这种情况,你应该明确地使用字典。

或者,当您知道项目数时,您可以使用数组:

 int[] initA = new int[m]; for (int i = 0; i < m; i++) initA[i] = i;