2009-07-08 35 views
16

Tôi gần như lúng túng khi hỏi câu hỏi này, nhưng với tư cách là một lập trình viên C trong thời gian dài tôi cảm thấy rằng có lẽ tôi không biết cách tốt nhất để làm điều này trong C#.Cách tốt nhất để trả về hai danh sách trong C# là gì?

Tôi có chức năng thành viên mà tôi cần trả lại hai danh sách loại tùy chỉnh (List<MyType>) và tôi biết trước rằng tôi sẽ luôn có giá trị trả về chỉ hai trong số các danh sách này.

Các tùy chọn hiển nhiên là:

public List<List<MyType>> ReturnTwoLists(); 

hoặc

public void ReturnTwoLists(ref List<MyType> listOne, ref List<myType> listTwo); 

Cả hai dường như là không tối ưu.

Bất kỳ đề xuất nào về cách cải thiện điều này?

Cách thứ nhất không rõ ràng trong cú pháp chỉ có 2 danh sách được trả về và thứ hai sử dụng tham chiếu thay vì giá trị trả về, có vẻ như không phải là C#.

Trả lời

31

Trước hết, đó có lẽ nên được out, không ref.

Thứ hai, bạn có thể khai báo và trả lại loại có chứa hai danh sách.

Thứ ba, bạn có thể khai báo một generic Tuple và trả về một thể hiện của rằng:

class Tuple<T,U> { 
    public Tuple(T first, U second) { 
     First = first; 
     Second = second; 
    } 
    public T First { get; private set; } 
    public U Second { get; private set; } 
} 

static class Tuple { 
    // The following method is declared to take advantage of 
    // compiler type inference features and let us not specify 
    // the type parameters manually. 
    public static Tuple<T,U> Create<T,U>(T first, U second) { 
     return new Tuple<T,U>(first, second); 
    } 
} 

return Tuple.Create(firstList, secondList); 

Bạn có thể mở rộng ý tưởng này cho số khác nhau của các mặt hàng.

+7

Chỉ còn lại ... .NET 4.0 có Tuple <> type. –

+12

Tôi thấy rằng bạn đã sử dụng T và U để chỉ định các mục. Nếu bạn có nhiều hơn 2 tuple, bạn sẽ đi cho T-U-V-W ... hoặc T-U-P-L-E? :) –

+5

@Mark: không nghĩ về nó. Trước khi nghĩ về điều đó, tôi sẽ nghĩ đến việc chuyển sang F #! –

24

Return này:

public class MyTwoLists { 
    public List<MyType> ListOne {get;set;} 
    public List<MyType> ListTwo {get;set;} 
} 
0

Tạo cấu trúc đơn giản chứa cả hai và trả về kết quả đó làm đầu ra của hàm?

4

Đề xuất đầu tiên của bạn không phải là hai danh sách. Đó là danh sách các danh sách.

Tùy chọn thứ hai sẽ làm những gì bạn định, nhưng bạn có thể muốn thay đổi nó để sử dụng từ khóa thay vì ref để người gọi phương pháp của bạn biết được ý định của những gì bạn đang làm.

public void ReturnTwoLists(out List<MyType> listOne, out List<myType> listTwo); 
3

Bạn có một vài lựa chọn:

sử dụng một cặp nếu danh sách là vô nghĩa theo thứ tự:

public Pair<List<MyType>,List<MyType> ReturnTwoLists() 
{ 
     return new Pair(new List<MyType(), new List<MyType()); 
} 

Bạn có thể sử dụng ra hoặc ref thông số, như bạn nói . Đây là một lựa chọn tốt nếu một danh sách có ý nghĩa hơn cái kia.

Bạn có thể sử dụng một từ điển nếu khách hàng sẽ biết các phím, hoặc muốn làm việc để tìm họ:

public Dictionary<string,List<MyType> ReturnTwoLists() 
{ 
     Dictionary<string,List<MyTpe>> d = new Dictionary<string,List<MyType>>(); 
     d.Add("FirstList",new List<MyType>()); 
     d.Add("SecondList",new List<MyType>()); 
     return new Dictionary()(new List<MyType(), new List<MyType()); 
} 

Hoặc, "đúng" giải pháp nhất trong mắt tôi, cho đầy đủ và nhất quán, sẽ tạo một lớp chứa dữ liệu đơn giản để giữ hai danh sách.Điều này cung cấp cho người tiêu dùng các giá trị trả về được biên dịch tĩnh tốt (được đọc: intellisense-enabled) để làm việc với. Lớp có thể được lồng ngay bên cạnh phương thức.

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