我试图将项目添加到列表而不动态地使用.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#中使用不安全的代码有风险
答案 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;