【问题标题】:How do I create a multidimensional array list in c#?如何在 C# 中创建多维数组列表?
【发布时间】:2011-04-18 11:20:46
【问题描述】:

是否可以在 C# 中创建多维数组列表?

StartDate   Qty   size
9/1/2010    10     15
9/1/2009    12     17
9/1/2008    11     19

StartDateQtysize 是 3 个数组列表。我需要将它们放在一个数组列表中。我还需要按StartDate 对这个数组列表进行排序。这可能吗?除了arraylist还有更好的方法吗?

【问题讨论】:

    标签: c# arraylist


    【解决方案1】:

    你可以这样做,是的。但在这种情况下,由于每一行似乎都是相关的,为什么不创建一个类来保存数据:

    public class Info
    {
        public DateTime StartDate { get; set; }
        public int Qty { get; set; }
        public int Size { get; set; }
    }
    

    然后有一个常规的 List 来保存对象:

    List<Info> infoList = new List<Info>();
    

    这将使您不必担心每个列表的顺序。要处理排序,您可以使用 LINQ to Objects Extension 方法:

    var sortedList = infoList.OrderBy(i => i.StartDate);
    

    【讨论】:

    • 该死……打败我。 :-p(+1 手指比我快。)
    • 按开始日期排序:var sortedList = infoList.OrderBy(x => x.StartDate)
    • 显然它是按降序排列的,所以你应该使用OrderByDescending()
    • 作为一项规则(就我自己而言),避免使用并行数组。总是喜欢单个对象数组。所以贾斯汀的回答是对的。
    • 如何在此列表中添加项目?
    【解决方案2】:

    如果可以,请选择贾斯汀的回答。从长远来看,这将避免令人头疼的问题,因为每个属性都有意义。如果您需要一种快速方法并且拥有 .NET 4,则可以在列表中列出 Tuple。比如

    List<Tuple<DateTime, int, int>> myData = new List<Tuple<DateTime, int, int>>();
    myData.Add(new Tuple<DateTime, int, int>(DateTime.Now, 1, 2));
    
    //
    
    DateTime myDate = myData[0].Item1;
    int myQty = myData[0].Item2;
    int mySize = myData[0].Item3;
    

    如果您没有 .NET 4,实现自己的元组是微不足道的。但是,如果您要这样做,不妨跳回顶部并按照贾斯汀的回答。

    编辑为完整起见,以下是使用此方法的排序选项。

    // descending sort done in place using List<>.Sort
    myData.Sort((t1, t2) => -1 * t1.Item1.CompareTo(t2.Item1)); 
    
    // descending sort performed as necessary in a sequence
    var orderedList = myData.OrderByDescending(t => t.Item1);
    

    【讨论】:

    • 如果我们要吹嘘 .NET 4... 为什么不使用 'var myData = ...'?
    • 我不是特别喜欢var,通常只在处理查询时使用它(有时甚至不使用)。除此之外,我更喜欢在任何时候都直言不讳。
    • 我知道在某些情况下,显式更好......猜猜它只是偏好没有必要输入 List> 两次 - 在每边一次=.
    • @Werner,是的,这只是一种偏好。但是要扮演魔鬼的拥护者,您仍然只输入一次,智能感知将负担放在右侧。
    【解决方案3】:

    您想要一个列表列表。也没有理由使用 ArrayList。从你的例子:

    List<List<DateTime>> list = new List<List<DateTime>>();
    

    也就是说,我更喜欢 Justin 上面展示的内容。

    【讨论】:

      【解决方案4】:

      如果这些属性描述了一个实体或“数据行”,您可以考虑创建一个类:

      public class MyClass
      {
          public DateTime StartDate {get;set;}
          public int Qty {get;set;}
          public int Size {get;set;}
      }
      

      然后您可以创建这些对象的数组:

      List<MyClass> myClassArray = new List<MyClass>();
      

      【讨论】:

        【解决方案5】:

        您可以使用 SortedList&lt;&gt; 并添加一个具有 3 个 List&lt;&gt; 实例的对象。然后你需要编写一个比较器来按StartDate对你的对象进行排序

        【讨论】:

          【解决方案6】:
          public struct MyStruct
          {
              public DateTime StartDate { get; set; }
              public int Qty { get; set; }
              public int Size { get; set; }
          }
          ...
          List<MyStruct> MyList = new List<MyStruct>();
          ...
          MyList.Sort((item1, item2) => item1.Qty.CompareTo(item2.Qty)); //ascending sort
          ...
          MyList.Sort((item1, item2) => item2.Qty.CompareTo(item1.Qty)); //descending sort
          

          【讨论】:

          • 可变结构!召集您的妇女和儿童,让他们安全!
          • @Anthony Pegram:我认为这是一种优化,它将提高排序操作的性能。如果我错了,请纠正我。
          • 我不知道 struct 与 class 在排序情况下的性能,除了说测试它并在各种场景中查看,所有这些我都无法进入。但我的评论是指可变结构被全面认为是邪恶的这一事实。有关更多信息,请参阅此问题和答案以及链接的博客文章等。 stackoverflow.com/questions/441309/why-are-mutable-structs-evil
          • @Anthony:你是对的。我已经在一些不同的情况下测试了它们。结果很有趣。当使用具有主要类型的属性时,结构列表在排序操作中要快一些。但是在属性中使用其他类型时,并没有太大区别。但在这两种情况下,将大量数据添加到结构列表中也比类列表快一点。
          猜你喜欢
          • 2019-05-04
          • 1970-01-01
          • 2011-12-14
          • 2023-03-23
          • 2020-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多