2010-09-28 47 views
11

Có thể tạo danh sách mảng đa chiều trong C# không?Làm cách nào để tạo danh sách mảng đa chiều trong C#?

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

StartDate, Qtysize là 3 ArrayLists. Tôi cần phải có chúng trong một danh sách duy nhất. Tôi cũng sẽ cần phải sắp xếp danh sách này theo StartDate. Điều này có thể không? Có cách nào tốt hơn để làm điều đó ngoài mảng danh sách?

Trả lời

30

Bạn có thể làm theo cách đó, có. Nhưng trong trường hợp này vì mỗi hàng dường như liên quan, tại sao không tạo ra một lớp để giữ dữ liệu:

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

Và sau đó chỉ cần có một danh sách thường xuyên để giữ các đối tượng:

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

Điều đó sẽ giúp bạn tiết kiệm từ phải lo lắng về thứ tự của từng Danh sách. Để xử lý việc đặt hàng, bạn có thể sử dụng các phương thức Mở rộng LINQ to Objects:

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

Đợi ... đánh bại tôi. :-p (+1 để có ngón tay nhanh hơn tôi.) – JasCav

+0

Để sắp xếp điều này bằng Startdate: var sortList = infoList.OrderBy (x => x.StartDate) – HitLikeAHammer

+0

Dường như nó theo thứ tự giảm dần nên bạn nên sử dụng 'OrderByDescending() '. –

1

Bạn muốn danh sách danh sách. Không có lý do gì để sử dụng ArrayList. Từ ví dụ của bạn:

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

Điều đó nói rằng, tôi thích điều gì đó như Justin đã trình bày ở trên.

1

Nếu các thuộc tính mô tả một thực thể hay "hàng dữ liệu", bạn có thể xem xét việc tạo một lớp:

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

Sau đó bạn có thể tạo một mảng của các đối tượng:

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

Bạn có thể sử dụng một SortedList<> và có một đối tượng được thêm vào nó có các phiên bản 3 List<>. Sau đó, bạn cần phải viết một so sánh để sắp xếp các đối tượng của mình theo StartDate

2

Khi bạn có thể, hãy đi với câu trả lời của Justin. Nó sẽ tiết kiệm đau đầu trong thời gian dài vì mỗi tài sản có ý nghĩa. Nếu bạn cần một cách tiếp cận nhanh chóng và bạn có .NET 4, bạn có thể liệt kê các Tuple trong một danh sách. Chẳng hạn như

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; 

Nếu bạn không có .NET 4, điều này không quan trọng để thực hiện bộ dữ liệu của riêng bạn. Tuy nhiên, nếu bạn định làm điều đó, cũng có thể bỏ qua trở lại đầu trang và đi với câu trả lời của Justin.

Chỉnh sửa Để hoàn chỉnh, dưới đây là các tùy chọn sắp xếp bằng cách sử dụng phương pháp này.

// 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); 
+0

Nếu chúng ta sắp khoe khoang về .NET 4 ... tại sao bạn không sử dụng 'var myData = ...'? – WernerCD

+1

Tôi không đặc biệt thích 'var' và thường chỉ sử dụng nó khi giao dịch với các truy vấn (và đôi khi thậm chí không phải sau đó). Đối với tất cả những người khác, tôi thích được rõ ràng ở tất cả các lần. –

+0

Tôi hiểu rằng trong một số trường hợp, rõ ràng là tốt hơn ... Đoán sở thích của nó mà không cần phải loại bỏ Danh sách > hai lần - một lần ở mỗi bên của =. – WernerCD

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

CẤU HÌNH MUTABLE! Thu thập phụ nữ và trẻ em của bạn và đưa chúng đến nơi an toàn! –

+0

@Anthony Pegram: tôi nghĩ đây là một tối ưu hóa và nó sẽ tăng hiệu suất trong các hành động sắp xếp. sửa tôi nếu tôi sai. – syntaxcheck

+0

Tôi không có ý tưởng về hiệu suất của struct so với lớp trong một tình huống sắp xếp ngoại trừ để nói kiểm tra nó và thấy trong các kịch bản khác nhau, tất cả những gì tôi không thể đi vào. Nhưng nhận xét của tôi đề cập đến thực tế rằng các cấu trúc có thể thay đổi được coi là ác. Xem câu hỏi này và câu trả lời cũng như các bài đăng trên blog được liên kết, v.v., để biết thêm về điều đó. http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil –

Các vấn đề liên quan