如何将数组和单个元素传递给多参数方法?

时间:2013-08-02 12:45:06

标签: c# methods

示例:

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

我们可以用以下方法调用此方法:

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

但是无法用以下方法调用该方法:

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

所以当我有一个字符串和一个字符串数组时,我是否必须先将它们放入一个数组中才能调用该方法?或者是否有一个很好的解决方法来告诉方法将字符串数组视为单个字符串?

4 个答案:

答案 0 :(得分:1)

虽然你可以在不使用扩展方法的情况下解决这个问题,但我实际上建议使用这种扩展方法,因为我发现只要我有一个对象但需要一个IEnumerable< T >只返回那个单一的对象。

扩展方法:

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

        yield return item;
    }
}

扩展方法在许多情况下都很有用。在您的情况下,您现在可以这样做:

string[] someArray = new string[] {"test1", "test2", "test3"};
foo(someArray.Concat("test4".Yield()).ToArray());

答案 1 :(得分:0)

只有方法的最后一个参数可以是参数数组(params),因此您不能将多个变量传递给其签名仅在params中使用的方法。

因此,您在C尝试执行的操作是不可能的,您必须将该字符串添加到数组中,或者创建一个也首先采用字符串参数的重载。

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

答案 2 :(得分:0)

我认为你假设string[] s接受一个字符串参数以及一个字符串数组,但事实并非如此。你可以通过这个来实现。

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

}

(请记住params必须是最后一个参数)

然后调用:

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

注意首先传递数组,然后传递作为params传递的参数。

答案 3 :(得分:0)

只需将您的字符串添加到数组中:

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

foo(newArray);