2009-10-08 32 views
6

Tôi có một hàm cần trả lại hai chuỗi. Tôi đã xem xét hai cách khác nhau để làm điều này:Trả về KeyValuePair hoặc sử dụng biến trong C#?

string first = "this is first"; 
string second = "this is second"; 
KeyValuePair<string, string> ReturnPair() 
{ 
    return new KeyValuePair<string, string>(first, second); 
} 
string ReturnOne(out string other) 
{ 
    other = second; 
    return first; 
} 

Tôi muốn sử dụng KeyValuePair <> cách tiếp cận nhưng tôi cảm thấy rằng tôi đang lợi dụng mục đích mà đối tượng này đã được tạo ra.

Câu hỏi của tôi:

  1. Có cách nào tốt hơn để trở lại 2 chuỗi trong ví dụ này?
  2. Có gì sai khi trả lại KeyValuePair không?

Trả lời

20

Trong khi không có gì kỹ thuật sai với trở KeyValuePair là, điều bạn đang quay trở lại là không khái niệm một "giá trị khóa" cặp. Đó là một cặp đơn giản.

Hoặc bạn có thể sử dụng Tuple, có sẵn trong .NET 4.0 hoặc trong thời gian chờ đợi, khai báo your own structure.

Tôi thường tư vấn chống lại thông số out cho các bộ dữ liệu trả về. Đặc biệt khi bạn đang sử dụng LINQ và cấu trúc ngôn ngữ chức năng, làm việc với thông số out là tẻ nhạt.

+0

Đúng, điều tôi đang quay trở lại KHÔNG phải là KeyValuePair và đó là lý do tôi do dự khi sử dụng cấu trúc đó. Vấn đề là một Tuple. Cảm ơn ý tưởng của bạn. – Guy

3

ý kiến ​​cá nhân của tôi sẽ là

void ReturnTwo(out string one, out string two) 
{ 
    // do assignments 
} 

tôi cảm thấy điều này làm cho nó rõ ràng hơn về những gì các giá trị trả lại là.

6

Nếu dữ liệu thuộc về lôgíc với nhau, nhưng một cách không hợp lý là chìa khóa của cái kia, tôi sẽ định nghĩa một kiểu mới đóng gói nó.

Nếu một là chìa khóa cho người khác, tôi sẽ sử dụng NameValuePair.

+0

Tôi cũng sẽ nói điều này. Ví dụ, nếu bạn đại diện cho hai tên của một người, bạn có thể có một lớp với một thuộc tính FirstName và LastName. Điều này mở ra khả năng tạo ra một FullName getter trong tương lai. – StriplingWarrior

6

Đây sẽ là phương pháp ưa thích của tôi. KeyValuePair quá chi tiết.

String[] ReturnPair() 
{ 
    return new [] { first, second }; 
} 
+0

haha ​​funny .. +1 – nawfal

0

Có một câu hỏi tương tự với một loạt các câu trả lời: How do you return two values from a single method?

Từ quan điểm "sạch-code", sử dụng các thông số "ra" để trở về hai chuỗi này là xấu. Giả sử bạn không có thời gian để tái cấu trúc/dọn dẹp thiết kế của bạn, giải pháp do John Kraft đề xuất chắc chắn là chấp nhận được.

1

Tôi không phải là người hâm mộ của nhiều parm đầu ra. Tôi cũng không thích sử dụng cặp giá trị khóa nếu chuỗi đầu tiên không thực sự là một khóa. Đề xuất của tôi sẽ là trả lại Danh sách < chuỗi >. Điều này sẽ cung cấp một chữ ký linh hoạt và ổn định. Ví dụ, nếu sau này bạn quyết định muốn trả lại 3 hoặc 4 chuỗi, bạn chỉ có thể cập nhật logic bên trong phương thức mà không cần khỉ với chữ ký.

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