将“new”应用于多维数组的一个维度?

3

我有一个C#程序,其中包含以下代码:

/*10 data for one peprson */
private int[] data = new int[10];
private void SomeMethod()
{   
    /*More code*/
    this.data = new int[10];
    /*More code*/
}

当事件发生时,此程序调用此方法,并且每次发生这种情况,这个一维数组都会获得一个大小为10的“新”数组实例,并刷新数组。有点像重置它。

现在,我被告知编写一个新程序,做同样的事情,只是现在有5个人。因此,我创建了一个二维数组,如下所示:

private int[,] data = new int[5, 10];

这个二维数组可以为每个人存储10条数据。现在我不知道如何刷新/重置其中一个人的数据。我尝试了

private void SomeMethod(int index) /*index 0 - 4 for each of the 5 people*/
{
     this.data[index] = new int[10];
}

但是这显然行不通,我收到了一个错误提示说我缺少一个维度。有没有办法实现这个目标? 目前,我正在使用

private void SomeMethod(int index) /*index 0 - 4 for each of the 5 people*/
{
     for(int i=0; i<10; i++)
         this.data[index, i] = 0;
}

当我使用原始代码进行测试时,我注意到每次它得到一个“新”实例时,都会将0分配给数组。现在的区别是原始代码是引用没有数据(因此为0?)的新实例,而改写后的代码是用0进行覆盖。
在程序功能方面,这两个基本上是相同的吗?

3
你可以考虑使用嵌套数组(jagged/nested array)代替多维数组(multi-dimensional array)。 - SLaks
2
多维数组有点像一个网格。你需要使用X和Y值进行索引。实际上并没有所谓的“行”(至少不是通过在单个索引处分配新数组的方式)。虽然你的最后一个解决方案没有问题,正如@SLaks所说,你可能想使用锯齿数组(数组的数组)。这样你就可以一次替换整个“行”。 - maccettura
谢谢大家。是的,似乎应该使用不规则数组。 - Mika Jones
1个回答

4

你的代码没有问题。甚至可能比创建新数组更快。但是如果你真的想要,可以使用交错数组代替:

private int[][] data = new int[5][];

//...

private void SomeMethod(int index) /*index 0 - 4 for each of the 5 people*/
{
     this.data[index] = new int[10];
}

但是对于这个问题,数组似乎不太合适。使用 List<T> 可能更好:

private List<int[]> data = new List<int[]>();

你可以使用.Add()方法来获取新记录,并使用Count属性知道你已经添加了多少。此外,通常会发现int [10]数组实际上是命名字段的替代品,数组中的每个位置都具有特定含义。在这种情况下,最好构建一个数据用的class,其中数组中的每个项目都是类中的命名字段(我们暂时称之为MyClass)。这样你就得到了以下类似于这样的内容:

private List<MyClass> data = new List<MyClass>();

3
支持List<T>这个想法(尽管属性称为Count而不是Length)。 - René Vogt
1
@RenéVogt 已修复,谢谢。这是一个愚蠢的问题,但如果我没有智能感知,我就必须每次查找它。 - Joel Coehoorn
是啊,我也是哈哈,我总是把CountLength搞混。我也喜欢使用List<T>的想法!谢谢大家的帮助,感觉自己又变聪明了一点。 - Mika Jones
这就是为什么 Resharper 允许您为每个此类类型键入 Count 或 Length,然后替换正确的内容。 - Evk
如果他并没有严格地绑定到数组结构,通过这个赋值,或者一些非常奇怪的业务需求,为什么不完全跳过数组列表,真正进入面向对象编程的核心。创建一个具有属性int []的类对象。这允许您拥有可变数量的对象,并在项目变得相关时添加更多属性。 - user7396598
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接