2012-11-07 41 views
14

Tôi có một phương thức lấy tham số. Bên trong phương pháp biến khác sẽ được bổ sung vào đầu ra:C#: Chuyển đổi mảng để sử dụng trong các tham số có tham số bổ sung

private void ParamsTest(params object[] objs) 
{ 
    var foo = "hello"; 
    // Invalid: Interpretes objs as single array parameter: 
    Console.WriteLine("{0}, {1}, {2}", foo, objs); 
} 

Khi tôi gọi

ParamsTest("Hi", "Ho"); 

Tôi muốn nhìn thấy đầu ra.

hello Hi Ho 

Tôi cần làm gì?

Tôi có thể sao chép fooobjs vào mảng mới và chuyển mảng đó đến WriteLine nhưng có cách nào thanh lịch hơn để buộc objs hoạt động như tham số một lần nữa không? Loại objs.ToParams()?

+0

Đừng sidetracked bởi ví dụ Console.WriteLine hoặc chuỗi định dạng. Đây không phải là vấn đề thực sự của tôi. Câu hỏi thực sự: Làm thế nào tôi có thể làm cho WriteLine thấy 4 (định dạng, foo và 2 phần tử mảng) args thay vì 3 (định dạng, foo và mảng). – AHalvar

Trả lời

10

Nếu vấn đề của bạn chỉ là thêm yếu tố khác để mảng của bạn, bạn có thể sử dụng một danh sách

List<object> list = new List<object> { "hello" }; 
list.AddRange(objs); 
Console.WriteLine("{0}, {1}, {2}, ...", list.ToArray()); 

params không phải là một kiểu dữ liệu. Các kiểu dữ liệu tham số chỉ là một mảng đơn giản.

+1

Đây là giải pháp hiện tại của tôi. Vì vậy, không có cách nào để làm điều này thanh lịch hơn, tức là không có phân bổ một danh sách và sao chép các đối tượng xung quanh? – AHalvar

+0

Vấn đề là, bạn không thể thay đổi kích thước một mảng trong .NET. Vì vậy, hãy sử dụng một kiểu dữ liệu bộ sưu tập khác hoặc sao chép các giá trị xung quanh. – Jan

1

Bạn có thể sử dụng vòng lặp foreach như thế này

string objsString = string.Empty; 
foreach (var ob in objs) 
    objsString += ", " + ob.ToString(); 
Console.WriteLine("{0}{1}", foo, objsString); 

Hoặc có cách tốt hơn:

string paramsString = string.Join(", ", objs); 
Console.WriteLine("{0}, {1}", foo, paramsString); 
0

Vòng qua các params mảng

var foo = "hello"; 
Console.Write(foo); 
objs.ForEach(obj => Console.Write(", {0}", obj.ToString())); 
Console.WriteLine(); 

Hoặc sử dụng String.Join() để tạo ra một biểu diễn chuỗi của mảng.

var foo = "hello"; 
string output = String.Join(", ", objs); 
Console.WriteLine("{0}, {1}", foo, output); 
6

Tôi sẽ sử dụng string.Join để làm định dạng:

Console.WriteLine("{0}, {1}", foo, string.Join(", ", objs)); 
+0

[liên kết ** hữu ích **] (http://msdn.microsoft.com/en-us/library/57a79xd0.aspx). –

+1

Điều này giải quyết vấn đề cho ví dụ Console.WriteLine, nhưng tự nhiên :) WriteLine không phải là vấn đề thực sự của tôi, chỉ là một minh họa (quá đơn giản?). – AHalvar

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