В C# ключевое слово params принимать несколько массивов

рассмотрим этот метод

public static void NumberList(params int[] numbers)
{
    foreach (int list in numbers)
    {
        Console.WriteLine(list);
    }
}

Я могу вызвать этот метод и поставить отдельный одиночный integers или только один массив с несколькими integers. В пределах области метода они будут помещены в массив с именем numbers (правильно?) где я могу продолжать манипулировать ими.

// Works fine
var arr = new int[] { 1, 2, 3};
NumberList(arr);

но если я хочу вызвать метод и вместо этого предоставить ему массивы, я получаю ошибку. Как включить массивы для params?

// Results in error
var arr = new int[] { 1, 2, 3};
var arr2 = new int[] { 4, 5, 6 };
NumberList(arr, arr2);

4 ответов


типа ты нуждающихся это int[]. Так что вам либо нужно пройти один int[], или пройти в individual int параметры и пусть компилятор выделит массив для вас. Но то, что ваша подпись метода не позволяет, - это несколько массивов.

если вы хотите передать несколько массивов, вы можете потребовать, чтобы ваш метод принял любую форму, которая позволяет передавать несколько массивов:

void Main()
{
    var arr = new[] { 1, 2, 3 };
    NumberList(arr, arr);
}

public static void NumberList(params int[][] numbers)
{
    foreach (var number in numbers.SelectMany(x => x))
    {
        Console.WriteLine(number);
    }
}

public void Test()
{
    int[]  arr1 = {1};
    int[]  arr2 = {2};
    int[]  arr3 = {3};

    Params(arr1);
    Params(arr1, arr2);
    Params(arr1, arr2, arr3);
}

public void Params(params int[][] arrs)
{

}

ваш метод настроен только на прием одного массива. Вы можете использовать список, если хотите отправить более одного за раз.

private void myMethod(List<int[]> arrays){
   arrays[0];
   arrays[1];//etc
}

вы не можете средствами langauge. Однако есть способ работать arround это overlading метод что-то вроде этого:

public static void NumberList(params int[][] arrays)
{
    foreach(var array in arrays)
        NumberList(array);
}

посмотреть здесь