2011-03-03 76 views
1

我解析一個逗號分隔的字符串到數組中。在C#中我有:這個C#到Ruby最乾淨的端口是什麼?

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

一)你的代碼像書面文件不符合你的期望。您致電.each並在字符串上調用非變異方法。因此,您的some_arraysome_string.split(',')相同。

b)中我個人做到這一點:

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

這產生了可以具有零的條目,然後將其與「緊湊」去掉的陣列。如果絕對速度是最重要的,雖然,這會更快:

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

編輯:修改後的代碼推遲.strip.downcase,直到測試的空白之後。

+0

感謝您解釋爲什麼它與非變異錯誤。你的回答接近我所看到的;在那裏堵塞一個零,然後緊湊。 – blu 2011-03-03 03:24:30

+0

你的答案都有效。我結束了與第二個與每個塊在一行中沒有重新分配和一切看起來不錯。謝謝。 – blu 2011-03-03 03:53:41

+0

空白?應該捕獲空白字符串,那麼我們可以將條帶移動到條件? – blu 2011-03-03 14:45:36

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()); 
+0

感謝您的回答。同意不進行預優化只是試圖移植它。那個C#很好看。 – blu 2011-03-03 03:22:49

+0

如果您想打高爾夫,並通過相同的數組保存迭代兩次:'some_string.split(',')。reject(&:empty?)。map {| e | e.strip.downcase}' – 2011-03-03 03:38:47

+0

有些東西關閉了,它可能是我的代碼,但是輸入'first,second,thirD'會在數組中產生4個項目,而不是3個。結束C#版本沒有返回。任何人都可以驗證嗎? – blu 2011-03-03 03:40:47

相關問題