我正在将逗号分隔的字符串解析为数组。在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? }
有更简洁的方法吗?
答案 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_array
与some_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
。