2011-12-16 28 views
5

Tôi có hai Danh sách mà tôi đang truy cập theo chỉ mục (ví dụ: Name[10], Date[10]). Chúng được gắn chặt, vì vậy Name[10] có liên quan đến Date[10] và ngược lại.Sắp xếp hai Danh sách <T> cùng nhau làm một?

Thiết kế này đã hoạt động tốt nhưng bây giờ tôi cần sắp xếp chúng. Tôi có thể sắp xếp chúng một cách riêng lẻ nhưng rõ ràng là sẽ loại bỏ mối quan hệ giữa hai danh sách và làm cho chúng vô giá trị.

Tôi đã nghĩ đến việc sử dụng một số Dictionary<string, DateTime> thay vào đó nhưng có vẻ như tôi chỉ có thể truy cập bằng Khóa (cũng không khả thi). Về cơ bản tôi cần ba điều, hai giá trị và một chỉ mục mà tôi có thể lặp qua số lượng (không phải là foreach).

Có ai giúp được không? Có vẻ như tôi hoặc là cần phải thay đổi cấu trúc dữ liệu hoặc tập luyện như thế nào để sắp xếp hai biệt List<T> với nhau ...

public class Results 
{ 
public List<string> Name { get; set; } 
public List<DateTime> Date{ get; set; } 
} 

for (int x = 0; x < results; x++) 
{ z.N = results.Name[X]; z.D = results.Date[x]; } 

Trả lời

9

Có vẻ như bạn đang chiến đấu chống lại làm giải pháp rõ ràng trong đó bao gồm một chút chút công việc trả trước: tạo một loại để đóng gói cặp tên/ngày.

Đó là hoàn toàn bạn nên làm gì. Sau đó, bạn có thể có một danh sách, sắp xếp nó theo tên hoặc theo ngày hoặc bất cứ điều gì bạn muốn, và bạn không bao giờ cần phải lo lắng về hai danh sách nhận được ra khỏi đồng bộ, vv

Nếu bạn Results lớp không làm bất cứ điều gì ngoài chứa hai danh sách đó, bạn thực sự có thể kết thúc với cùng một số loại - bạn có thể bỏ hoàn toàn Results hoàn toàn, có lợi cho List<Result> trong đó Result có tên và ngày.

+0

anh ta có thể sử dụng từ điển chung – AMH

+3

@AMH: OP đã xem là - nó không bảo toàn trật tự, và về cơ bản * không * những gì anh ta đang cố gắng lưu trữ. Anh ta muốn một danh sách, nhưng có hai giá trị khác nhau. –

+1

Là một lợi ích bổ sung, giải pháp này sẽ cho phép bạn đặt tên rõ ràng cho bất kỳ khái niệm nào bạn đang cố gắng đại diện, và ngoài ra bạn có thể nhúng logic để thao tác dữ liệu này trong cùng một loại, thay vì có nó mã của bạn ở nơi khác. –

2

Làm cho mình một đặc ân và giữ hai thứ với nhau:

public class NameAndDate { 
    public string Name { get; set; } 
    public DateTime Date { get; set; } 
} 

Sau đó, bạn giữ chúng trong một danh sách (List<NameAndDate>):

Nếu bạn muốn sắp xếp theo tên, thêm một thi IComparer đến NameAndDate, sau đó bạn chỉ có thể gọi số Sort() trong danh sách.

Nếu bạn muốn giữ lại quyền truy cập vào tên và ngày, thêm các phương pháp accessor lại kết quả, như

public string GetName(int index) { 
    return list[i].Name; 
} 
1

Bạn thể tạo một kiểu tùy chỉnh để giữ một giá trị hoặc nếu bạn chỉ cần sử dụng nó trong phạm vi của một phương pháp duy nhất bạn có thể sử dụng một loại vô danh như sau.

var namesAndDates = MyNames 
    .Select((name, i) => new {name, date = MyDates[i]}); 

Từ đây hai giá trị không còn bị ràng buộc lỏng lẻo nữa. Bây giờ bạn có thể sắp xếp chúng.

var sortedNamesAndDates = namesAndDates.OrderBy(a => a.date); 

Hoặc bất kỳ điều gì khác bạn sẽ cần phải thực hiện với chúng.

0

bạn thể sử dụng từ điển với Tên Key, và giá trị so ngày

và U có thể sau khi loại mà họ dễ dàng

2
List<Tuple<string,DateTime> NameDateList {get; set; } 

là một cách dễ dàng để thực hiện những gì bạn muốn, nhưng đối rõ ràng bạn có lẽ khấm khá hơn làm một kiểu tùy chỉnh đến nhà họ như:

public class NameDate 
{ 
    public string Name { get; set; } 
    public DateTime Date{ get; set; } 
} 

Sau đó, bạn có thể sử dụng:

List<NameDate> NameDateList {get; set; } 
1

Tạo một lớp gọi là "kết quả" với hai thuộc tính

public class Result 
{ 
    public string Name {set;get;} 
    public DateTime Date { set;get;} 
} 

Bây giờ bạn có thể tạo một danh sách của lớp này

List<Result> objListResult=new List<Result>(); 

Bây giờ trong trường hợp của bạn, Nếu bạn muốn, bạn có thể đọc nội dung của Danh sách cá nhân của bạn và đưa nó vào Danh sách mới của chúng tôi. (Điều này chỉ phù hợp với trường hợp của bạn, nếu bạn thực sự muốn di chuyển dữ liệu từ Danh sách cũ sang Danh sách mới của chúng tôi. Nếu có thể, bạn có thể cập nhật mã nơi bạn tải dữ liệu vào hai Danh sách (đó là cách chính xác) để nó tải dữ liệu vào danh sách mới của chúng ta về Loại quả và tránh mã này porting để di chuyển dữ liệu vào danh sách mới.

for(int i=0;i<Name.Count;i++) 
{ 
    objListResult.Add(new Result { Name =Name[i].ToString(), Date[i].ToString() }); 
} 

bạn có thể truy cập vào các mục từ danh sách mới như thế này

objListResult[2].Date 

sẽ cung cấp cho bạn Ngày được lưu trữ cho đối tượng thứ hai trong danh sách

objListResult[2].Name 

sẽ cung cấp cho bạn Tên được lưu trữ cho đối tượng thứ hai trong danh sách

+0

Vàng này chưa được bình chọn như thế nào ngay cả một lần ... –

6

Sử dụng quá tải Array.Sort mất một dãy khóa và một loạt giá trị, nó thực hiện chính xác những gì bạn muốn. (Phương pháp này đã có sẵn từ .NET 2.0.)

+2

Cảm ơn bạn đã trả lời câu hỏi như đã nêu. Việc ghép đôi tên và ngày với nhau giống như các câu trả lời khác gợi ý là lời khuyên tốt, nhưng có những tình huống lưu trữ hai mảng đối xứng có ý nghĩa. Cụ thể, bằng cách sử dụng bố cục dữ liệu 'Cấu trúc của mảng' trong một thuật toán tính toán chuyên sâu. –

+1

Hoàn hảo. Chính xác những gì tôi đang tìm kiếm. Tôi không biết tính năng này đã tồn tại. – Timo

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