2012-09-05 70 views
1

我使用下面的代碼刪除字符串的一部分:如何輕鬆地從字符串數組在C#

var names = ConfigurationManager.AppSettings.AllKeys.Where(k => k.StartsWith("name")); 

,我得到這樣的鍵:1,名稱,name16,name18。

現在我想創建另一個數組,它將刪除名稱並保持1,2,16,18。上面的代碼本身有沒有簡單的方法來做到這一點?還是分開做?

回答

6

您可以直接

ConfigurationManager.AppSettings.AllKeys.Where(k => k.StartsWith("name")).Select(a => a.Replace("name","")); 
+0

問題:有沒有**'static' **'Replace'方法,所以它不會編譯,我猜。在'Select'(在第二行代碼行)之前調用'ToList()'**是不好的。 –

+2

這是一個很好的解決方案,但是它利用了這個問題的一個邊緣情況,如果Name不止一次出現,你不會得到相同的結果,我認爲使用'SubString'是一個更好的方法,因爲你知道你的文本從你的文本開始搜索字符串從感謝'Where'子句。 –

+0

感謝Scott的評論 –

1

試試這個:

var names = ConfigurationManager.AppSettings.AllKeys.Where(k => k.StartsWith("name")).Select(p => p.Replace("name", "")); 
0

用途:

var namesWithoutPrefix = names.Select(n => n.Substring(4)); 

做的Replace代替Substring可能更換幾個子在一個名稱(和更慢如果它不這樣做的話)。

+0

贊同此答案。但是你認爲這比上面提到的Replace的代碼更快? – NoviceMe

+0

@NoviceMe機會是字符串這個短的所有這些方法之間的性能差異將是如此之小,你無法衡量它。如果字符串長達幾百萬個字符,那麼它可能開始變得重要。 – Servy

+0

@NoviceMe是的,假設(像塞維維說的那樣)'n'是千萬字長。要做'Substring(4)',你只需要將最後的9'999'996個字符複製到一個新的字符串實例中。要做'Replace'(「name」,「」)',你必須檢查所有的位置(近一千萬個位置),看看這四個字符是否是'','a','m','e''按照這個順序出現,只有當它們沒有時才複製到新字符串。後者會更慢。 –

0

我不會推薦依賴數字值的位置或字符串的長度或者文本讀取'name'的事實。相反,您可以使用簡單的正則表達式來持續提取它:

Regex regex = new Regex(@"[0-9]+"); 
var numbers = ConfigurationManager.AppSettings 
    .AllKeys.Select(p => regex.Match(p).Value).ToArray(); 
2

我認爲您的代碼足夠好。只是表現一點點用串改善,因爲它是簡單的操作,以刪除前綴:

var prefix = "name"; // could be a parameter or used as const; just for example 
var nums = ConfigurationManager.AppSettings.AllKeys.Where(s => s.StartsWith(prefix)).Select(s => s.Substring(prefix.Length)).ToArray(); 
+1

+1非常好的解決方案。比其他建議好得多,我只是說ToArray()不是必需的,只是把它作爲一個IEnumerable來使用

相關問題