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

时间:2015-07-06 06:11:35

标签: c# list

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

List<int> initA = new List<int>();
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数组用于内部数组,因为我不知道知道它的大小。 set元素在运行时添加。

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

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

在C ++中这是一个非常简单的任务,你可以使用指针......事实上,这是我解决问题的方法,因为在C#中使用不安全的代码有风险

4 个答案:

答案 0 :(得分:2)

你不能。

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

因此,在修改特定位置的项目之前,您肯定需要填写您的列表,例如:

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

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

答案 1 :(得分:2)

您可以使用词典:

<强>用法:

window.location.search

<强>代码:

window.location.search = '?id=03'

答案 2 :(得分:1)

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

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

甚至:

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

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

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

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

答案 3 :(得分:0)

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

List<int> initA = new List<int>();
for (int i = 0; i < m; i++)
     initA.SetValueAtIndex(i, i);


public static void SetValueAtIndex<T>(this IList<T> 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;