2013-08-02 32 views
5

Ví dụ:Làm thế nào để truyền một mảng và một phần tử đơn lẻ cho một phương thức nhiều đối số?

public void foo(params string[] s) { ... } 

Chúng ta có thể gọi phương thức này với:

a) foo("test", "test2", "test3") // multiple single strings 
b) foo(new string[]{"test", "test2", "test3"}) // string array 

Nhưng nó không thể gọi phương thức với:

c) foo("test", new string[]{"test", "test2", "test3"}) 

Vì vậy, khi tôi có một chuỗi đơn và một chuỗi các chuỗi, tôi có phải đặt chúng vào một mảng đầu tiên để gọi phương thức này không? Hoặc là có một workaround tốt đẹp để nói cho các phương pháp để xem xét các mảng chuỗi như chuỗi đơn?

+0

Bạn phải đặt chúng vào một mảng đầu tiên –

+0

có, bạn phải đặt chúng vào một mảng ... để khớp với chữ ký chức năng. Trừ khi bạn thêm một phương thức bao bọc có một chuỗi và một chuỗi các chuỗi. –

+0

sử dụng Từ điển cho điều đó –

Trả lời

0

Chỉ tham số cuối cùng của phương thức có thể là mảng tham số (params) vì vậy bạn không thể chuyển nhiều hơn một biến thành phương thức có chữ ký chỉ có trong params. Vì vậy những gì bạn đang cố gắng làm trong C là không thể và bạn phải thêm chuỗi đó vào một mảng, hoặc tạo ra một quá tải mà cũng phải mất một tham số chuỗi đầu tiên. Quay lại đầu trang ||||

public void foo(string firstString, params string[] s) 
{ 
} 
0

Tôi nghĩ bạn đang giả định rằng string[] s chấp nhận một đối số chuỗi đơn cũng như một chuỗi các chuỗi mà không có. Bạn có thể đạt được điều này thông qua.

public static void Test(string[] array, params string[] s) 
{ 

} 

(Ghi params phải là đối số cuối cùng)

Và sau đó để gọi:

Test(new string[]{"test", "test2", "test3"}, "test"); 

Chú ý cách mảng được thông qua năm đầu tiên, và sau đó lập luận rằng được thông qua như params.

0

Chỉ cần thêm chuỗi của bạn để mảng:

var newArray = new string[oldArray.length+1]; 
newArray[0]=yourString; 
oldArray.CopyTo(newArray, 1); 

foo(newArray); 
1

Trong khi bạn có thể giải quyết này mà không cần sử dụng một phương pháp khuyến nông, tôi thực sự khuyên bạn sử dụng phương pháp mở rộng này như tôi thấy nó rất hữu ích mỗi khi tôi có một đối tượng duy nhất nhưng cần một IEnumerable < T> đơn giản trả về đối tượng đơn lẻ đó.

phương pháp mở rộng:

public static class EnumerableYieldExtension 
{ 
    public static IEnumerable<T> Yield<T>(this T item) 
    { 
     if (item == null) 
      yield break; 

     yield return item; 
    } 
} 

Phương pháp mở rộng rất hữu ích trong nhiều tình huống. Trong trường hợp của bạn, bây giờ bạn có thể làm điều này:

string[] someArray = new string[] {"test1", "test2", "test3"}; 
foo(someArray.Concat("test4".Yield()).ToArray()); 
Các vấn đề liên quan