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

本文关键字:参数 方法 元素 数组 单个 | 更新日期: 2023-09-27 18:26:21

示例:

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"})

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

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

虽然您可以在不使用扩展方法的情况下解决此问题,但我实际上建议使用此扩展方法,因为每当我有一个对象但需要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());

我认为您假设string[] s接受单个字符串参数和字符串数组,但它不接受。您可以通过实现这一点。

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

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

然后调用:

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

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

只有方法的最后一个参数可以是参数数组(params),因此不能将多个变量传递到签名只接受params的方法中。

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

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

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

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