这个C#最干净的端口是什么?

时间:2011-03-03 02:53:00

标签: ruby-on-rails ruby

我正在将逗号分隔的字符串解析为数组。在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 个答案:

答案 0 :(得分:3)

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 }
}

旁注:我可能已经写过C#代码更像这样:

var someList = new List<string>(
    from s in someString.Split(
        new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    select s.Trim().ToLower());

答案 1 :(得分:2)

a)您所写的代码不符合您的期望。你调用.each并在字符串上调用非变异方法。因此,您的some_arraysome_string.split(',')相同。

b)我个人会这样做:

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

这将创建一个可能包含nil条目的数组,然后使用“compact”删除它们。但是,如果绝对速度至关重要,那么速度会更快:

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

修改:修改后的代码,以便在测试空白后推迟.strip.downcase