Переменные параметры - PullRequest
       24

Переменные параметры

0 голосов
/ 09 марта 2012

Существуют ли переменные параметры для параметров метода?
Мне нравится ключевое слово params . Но иногда мне нужно, чтобы два параметра были params .
Я хочу вызвать метод так:

Method(1, "a", 2, "b", 3, "c")

, где 1, 2 и 3 - ключи, а "a", "b" и "c" - назначенные значения.

Если я попытаюсь определить параметры метода, я бы интуитивно попытался использовать params для двух параметров, например:

void Method(params int[] i, string[] s)

Компилятор добавляет каждый параметр в нечетных позициях к первому параметру и каждый параметр в четных позициях ко второму параметру.
Но (как вы знаете) params возможно только для последнего параметра.

Конечно, я мог бы создать класс параметров (например, KeyValue) и использовать его так:

Method(new[] {new KeyValue(1, "a"), new KeyValue(2, "b"), new KeyValue(3, "c")})

Но это слишком много кода imo.

Есть ли более короткая запись?

Редактировать: Только сейчас я нашел хороший ответ на другой вопрос: предлагается наследовать от List и перегрузить Add метод, позволяющий инициализировать новый список следующим образом:

new KeyValueList<int, string>{{ 1, "a" }, { 2, "b" }, { 3, "c" }}

Определение метода будет:

void Method(KeyValueList<int, string> list)

Вызов будет:

 Method(new KeyValueList<int, string>{{ 1, "a" }, { 2, "b" }, { 3, "c" }})

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Нет обозначения «чередующиеся параметры», как вы описали.

У вас может быть только один params параметр, и он должен быть последним - если вы хотите иметь разные типы в качестве параметров params, вы можете использовать object в качестве типа массива.

Рассмотрите возможность передачи списка, составленного из пользовательского типа, который сохраняет значение этих элементов.

public class MyType
{
  public int MyNum { get; set; }
  public string MyStr { get; set; }
}

Method(List<MyType> myList);
1 голос
/ 09 марта 2012

Вы могли бы сделать это через params object[] keysAndValues и разобраться в этом самостоятельно, но ... это немного странно, что со всеми происходящими боксами / распаковками.

...