Используя пары "ключ-значение" как параметры

Проверьте оглавления для моих книг. И Изучение Perl и Промежуточный Perl разработаны, чтобы преподавать программистам язык Perl. Мы покрываем 80% Perl, что большинство людей использует все время и разработало это с лет и лет обучающих людей Perl. Каждая книга разработана как учебное руководство, и существуют упражнения в конце каждой главы. Я также записал Изучение Рабочей книги Студента Perl для обеспечения дополнительных упражнений. Perl Программирования является хорошей ссылкой, также.

существует на самом деле очень немного правил, что необходимо знать для "получения" Perl, и большинство людей не разбирается в этих правилах только путем рассмотрения кода. Некоторые вещи учить новые Perlers, которые происходят из другого языка:

  • строгий и предупреждения
  • Скаляр по сравнению с контекстом списка
  • динамичный по сравнению с лексическим контекстом
  • символ не является типом переменной
  • создание Списка и управление (карта, grep, вид)
  • , Как использовать CPAN эффективно
  • Закрытия и подпрограммы как данные
  • , Рекурсия в Perl сосет

Удача:)

11
задан Wim ten Brink 1 September 2009 в 12:48
поделиться

3 ответа

Если вы приняли IDictionary , вы, вероятно, могли бы использовать (по крайней мере, в C # 3.0):

Add(new Dictionary<int,string> {
     {1, "A"}, {2, "B"}, {3, "C"}, {4, "D"}
});

Любое использование?

Пример Добавьте :

static void Add(IDictionary<int, string> data) {
    foreach (var pair in data) {
        Console.WriteLine(pair.Key + " = " + pair.Value);
    }
}
23
ответ дан 3 December 2019 в 03:53
поделиться

Вы можете использовать что-то вроде следующего с очевидным недостатком, который вы теряете строгая типизация.

 public void Add(params Object[] inputs)
 {
     Int32 numberPairs = inputs.Length / 2;

     KeyValue[] keyValues = new KeyValue[numberPairs];

     for (Int32 i = 0; i < numberPairs; i++)
     {
         Int32 key = (Int32)inputs[2 * i];
         String value = (String)inputs[2 * i + 1];

         keyvalues[i] = new KeyValue(key, value);
     }

     // Call the overloaded method accepting KeyValue[].
     this.Add(keyValues);
 }

 public void Add(params KeyValue[] values)
 {
     // Do work here.
 }

Вы должны, конечно, добавить некоторую обработку ошибок, если аргументы имеют неправильный тип. Не очень умно, но сработает.

0
ответ дан 3 December 2019 в 03:53
поделиться

Вы можете изменить свой текущий дизайн класса, но вам нужно будет добавить обобщенные типы и использовать интерфейс IEnumerable.

    class KeyValue<TKey, TValue>
    {
        public KeyValue()
        {
        }
    }

    // 1. change: need to implement IEnumerable interface
    class KeyValueList<TKey, TValue> : IEnumerable<TKey>
    {
        // 2. prerequisite: parameterless constructor needed
        public KeyValueList()
        {
            // ...
        }

        // 3. need Add method to take advantage of
        // so called "collection initializers"
        public void Add(TKey key, TValue value)
        {
            // here you will need to initalize the
            // KeyValue object and add it
        }

        // need to implement IEnumerable<TKey> here!
    }

После этих добавлений вы можете сделать следующее:

    new KeyValueList<int, string>() { { 1, "A" }, { 2, "B" } };

Компилятор будет использовать интерфейс IEnumerable и метод Add для заполнения KeyValueList. Обратите внимание, что это работает для C # 3.0.

Если вы используете это для тестов, эти изменения не стоят того. Это довольно сложно, и вы меняете довольно много производственного кода для тестов.

3
ответ дан 3 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: