Какой самый чистый порт этого C # для Ruby? - PullRequest
1 голос
/ 03 марта 2011

Я анализирую разделенную запятыми строку в массив.В C # у меня есть:

var someArray = someString.Split(
    new char[] { ',' },
    StringSplitOptions.RemoveEmptyEntries);

foreach (var something in someArray)
{
    SomeList.Add(something.Trim().ToLower());
}

Вот что у меня есть в Ruby с использованием Rails .blank?

some_array = some_string.split(',').each { |something| something.strip.downcase }
some_array.delete_if { |something| something.blank? }

Есть ли более чистый способ сделать это?

Ответы [ 2 ]

3 голосов
/ 03 марта 2011
some_string.split(',').map(&:strip).map(&:downcase).reject(&:empty?)

Это создает три промежуточных массива и пересекает все три из них, но я бы не стал беспокоиться об этом, если бы вы на самом деле не смогли доказать с помощью профилирования производительности, что это серьезное узкое место.

В противном случае вам придется сделать что-то вроде

some_string.split(',').inject([]) {|ary, str|
  ary.tap { unless (str = str.strip.downcase).empty? then ary << str end }
}

Sidenote: Я бы, вероятно, написал этот код на C # примерно так:

var someList = new List<string>(
    from s in someString.Split(
        new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    select s.Trim().ToLower());
2 голосов
/ 03 марта 2011

а) Код, который вы написали, не соответствует вашим ожиданиям. Вы вызываете .each и вызываете неизменяемые методы для строк. В результате ваш some_array совпадает с some_string.split(',').

б) Я бы лично сделал это:

arr = str.split(',').map{ |s| s.blank? ? nil : s.strip.downcase }.compact

Это создает массив, который может иметь ноль записей, которые затем удаляются с помощью "compact". Если абсолютная скорость имеет существенное значение, это будет быстрее:

arr = []
str.split(',').each do |s|
  arr << s.strip.downcase unless s.blank?
end

Редактировать : изменен код для отсрочки .strip.downcase до окончания проверки на пустоту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...