将数组传递给可变长度参数列表

时间:2010-02-04 16:59:13

标签: c# arrays parameters

如果我有一个功能

void Foo(params int[] bar){}

以下运行良好:

int[] a1 = {1, 2, 3};
int[] a2 = {4, 5, 6};
Foo(1, 2, 3);
Foo(a1);

但这些会导致编译错误:

Foo(a1, 1, 2, 3);
Foo(1, 2, a1);
Foo(1, a1, 2);
Foo(a1, a2, 1, 2, 3);

因为只允许第一个参数为int [],其余的必须是int。

最后一个例子是我想要做的,但语言不会让我没有先组合数组。我非常喜欢语法的简单性,我宁愿不再添加代码。有没有人有一个很好的方法来做到这一点?

2 个答案:

答案 0 :(得分:11)

这很奇怪。 Foo(a1, 2, 3)不应该有用。你应该传递一个数组或一堆整数。你不能混合它们AFAIK。你还有其他超载吗?

这样做并没有真正的语法。我能想到的最简洁的是:

Foo(a1.Concat(a2).Concat(new[] {1,2,3}).ToArray());

答案 1 :(得分:2)

同意,非常奇怪的Foo(a1, 2, 3)有效。

下面是.Concat的扩展方法,使Mehrdad的语法在眼睛上更容易。

public T[] Concat<T>(this T[] first, params T[] other)
    {
        T[] output = new T[first.Length+other.Length];

        first.CopyTo(output,0);
        other.CopyTo(output,first.Length);
        return output;
    }

可以使用如下:

Foo(a1.Concat(a2).Concat(1,2,3));