如何在C#中创建多维数组列表?

11

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

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

StartDateQtysize是三个ArrayList。我需要将它们合并为一个ArrayList,并且需要按照StartDate进行排序。这是否可能?是否有比使用ArrayList更好的方法?

6个回答

30
你可以这样做,是的。但在这种情况下,由于每一行似乎都相关,为什么不创建一个类来保存数据呢:
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扩展方法:

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

拿去吧...你比我打得快。 :-p (+1 是因为你的手指比我快.) - JasCav
按照开始日期排序:var sortedList = infoList.OrderBy(x => x.StartDate) - HitLikeAHammer
显然它是按降序排列的,所以你应该使用 OrderByDescending() - Jeff Mercado
通常(就我个人而言),请避免使用并行数组。始终更喜欢使用单个对象数组。所以Justin的答案是正确的。 - Detmar
我该如何在这个列表中添加项目? - Dev

2

如果可以的话,建议采用Justin的答案。因为每个属性都有意义,这样可以在长期运行中避免出现问题。如果需要快速处理且你使用的是.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,那么实现自己的元组是微不足道的。但是,如果您打算这样做,最好跳回顶部并选择Justin的答案。
编辑:为了完整起见,以下是使用此方法进行排序的选项。
// 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 = ...”呢? - WernerCD
1
我并不特别喜欢使用 var,通常只在处理查询时使用它(有时甚至连那都不用)。对于其他所有情况,我更喜欢始终保持明确。 - Anthony Pegram
我明白,在某些情况下,显式更好...猜想这只是个人偏好,因为没有必要在=号两侧都输入List<tuple....>>。 - WernerCD
@Werner,是的,这只是个人偏好。但是为了扮演魔鬼的代言人,你仍然只需输入一次,智能感知会在右侧承担负担。 - Anthony Pegram

1

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

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

话虽如此,我更喜欢像Justin上面展示的那样。


1
如果这些属性描述一个实体或“数据行”,则可以考虑创建一个类:
public class MyClass
{
    public DateTime StartDate {get;set;}
    public int Qty {get;set;}
    public int Size {get;set;}
}

你可以创建一个这些对象的数组:
List<MyClass> myClassArray = new List<MyClass>();

0
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

1
可变结构体!快把你的女人和孩子们带到安全地带! - Anthony Pegram
@Anthony Pegram:我认为这是一种优化,它将提高排序操作的性能。如果我错了,请纠正我。 - syntaxcheck
除了测试并在各种情况下观察之外,我对结构体和类在排序情况下的性能没有什么概念。但是我的评论是指可变结构体被广泛认为是邪恶的事实。有关更多信息,请参见此问题、答案和链接的博客文章等。https://dev59.com/0XRC5IYBdhLWcg3wAcM3 - Anthony Pegram
@Anthony:完全正确。我在不同的情况下测试了它们两个,结果很有趣。当使用主类型的属性时,结构体列表在排序操作中稍微快一些。但是当使用其他类型的属性时,差别不大。但在这两种情况下,将大量数据添加到结构体列表中也比类列表快一点。 - syntaxcheck

0
你可以使用一个 SortedList<>,并将一个包含 3 个 List<> 实例的对象添加到其中。然后,你需要编写一个比较器来按 StartDate 对你的对象进行排序。

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