【问题标题】:Jagged Array Dimensions锯齿状阵列尺寸
【发布时间】:2010-05-27 19:45:06
【问题描述】:

我正在使用锯齿状数组并且有一点问题(或者至少我认为我有)。这些数组的大小由数据库中返回的行数决定,因此变化很大。我唯一的解决方案是将数组的尺寸设置为非常大,但这似乎......不是做事的最佳方式。

int[][] hulkSmash = new int[10][];
hulkSmash[0] = new int[2] {1,2};

如何在不设置维度的情况下处理锯齿状数组,或者这只是 C# 编程的现实??

【问题讨论】:

  • 为什么不直接使用 List> 或内置可变性的东西?

标签: c# jagged-arrays


【解决方案1】:

你有两个选择:

  • 您可以读取从数据库返回的信息的大小,并在当时分配您的数组空间,一旦您知道自己得到了什么。
  • 否则,您正在寻找的是具有可变维度的数据结构。以 List 为例:MSDN: List< T >

【讨论】:

    【解决方案2】:

    使用List&lt;T&gt; 和集合的其他示例是最好的方法。我有时会发现

    List<List<int>> hulkSmash = new List<List<int>>();
    

    语法有点笨拙。幸运的是,有一些选项可以管理这个。

    我有时使用的第一个选项是创建别名:

    using List<List<int>> = HulkSmashCollection;
    

    这使您不必一直嵌套&lt;&lt;&lt;Types&gt;&gt;&gt;。你可以在任何地方输入List&lt;List&lt;int&gt;&gt; 来代替输入HulkSmashCollection(或更短的)。


    第二个选项是将列表列表包装在一个名为 MyHulkSmashes 的类中。在这里,您只提供您需要的功能/属性,例如CountFind() 等。

    这两个概念都用于减少屏幕上的代码量,并降低感知的复杂性。

    【讨论】:

    • ...甚至声明public class HulkSmashCollection: List&lt;List&lt;int&gt;&gt; {}
    • 浏览列表的最佳方式?使用 foreach 循环遍历?
    • 是的,尽管有一些警告。集合在迭代期间可能不会改变。因此,从列表(或任何 IEnumerable 集合)中添加或删除项目将引发异常。
    • 虽然不推荐,但您可以通过向后循环更改列表中的项目...
    【解决方案3】:
    List<List<int>> hulkSmash = new List<List<int>>();
    hulkSmash.Add(new List<int>() { 1, 2 });
    

    List<int[]> hulkSmash = new List<int[]>();
    hulkSmash.Add(new int[] { 1, 2 });
    

    【讨论】:

    • 因为我以前从未使用过列表,所以首选方法是什么?列表列表还是列表或数组?
    • 如果您知道内部列表有多大并且永远不需要修改它们,那么数组会更轻,并且实际上没有“需要”成为列表。如果您有任何可能需要修改它或不知道初始大小,那么最好使用列表。
    • 列表在内部使用数组。它只是为您处理所有调整大小等。
    【解决方案4】:

    int 集合(如 List)将为您提供所需的灵活性,并且不会像分配比您需要的大得多的数组那样浪费空间。

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 2011-02-04
      相关资源
      最近更新 更多