我使用下面的代碼刪除字符串的一部分:如何輕鬆地從字符串數組在C#
var names = ConfigurationManager.AppSettings.AllKeys.Where(k => k.StartsWith("name"));
,我得到這樣的鍵:1,名稱,name16,name18。
現在我想創建另一個數組,它將刪除名稱並保持1,2,16,18。上面的代碼本身有沒有簡單的方法來做到這一點?還是分開做?
我使用下面的代碼刪除字符串的一部分:如何輕鬆地從字符串數組在C#
var names = ConfigurationManager.AppSettings.AllKeys.Where(k => k.StartsWith("name"));
,我得到這樣的鍵:1,名稱,name16,name18。
現在我想創建另一個數組,它將刪除名稱並保持1,2,16,18。上面的代碼本身有沒有簡單的方法來做到這一點?還是分開做?
您可以直接
ConfigurationManager.AppSettings.AllKeys.Where(k => k.StartsWith("name")).Select(a => a.Replace("name",""));
試試這個:
var names = ConfigurationManager.AppSettings.AllKeys.Where(k => k.StartsWith("name")).Select(p => p.Replace("name", ""));
用途:
var namesWithoutPrefix = names.Select(n => n.Substring(4));
做的Replace
代替Substring
可能更換幾個子在一個名稱(和更慢如果它不這樣做的話)。
贊同此答案。但是你認爲這比上面提到的Replace的代碼更快? – NoviceMe
@NoviceMe機會是字符串這個短的所有這些方法之間的性能差異將是如此之小,你無法衡量它。如果字符串長達幾百萬個字符,那麼它可能開始變得重要。 – Servy
@NoviceMe是的,假設(像塞維維說的那樣)'n'是千萬字長。要做'Substring(4)',你只需要將最後的9'999'996個字符複製到一個新的字符串實例中。要做'Replace'(「name」,「」)',你必須檢查所有的位置(近一千萬個位置),看看這四個字符是否是'','a','m','e''按照這個順序出現,只有當它們沒有時才複製到新字符串。後者會更慢。 –
我不會推薦依賴數字值的位置或字符串的長度或者文本讀取'name'的事實。相反,您可以使用簡單的正則表達式來持續提取它:
Regex regex = new Regex(@"[0-9]+");
var numbers = ConfigurationManager.AppSettings
.AllKeys.Select(p => regex.Match(p).Value).ToArray();
我認爲您的代碼足夠好。只是表現一點點用串改善,因爲它是簡單的操作,以刪除前綴:
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非常好的解決方案。比其他建議好得多,我只是說ToArray()不是必需的,只是把它作爲一個IEnumerable來使用
問題:有沒有**'static' **'Replace'方法,所以它不會編譯,我猜。在'Select'(在第二行代碼行)之前調用'ToList()'**是不好的。 –
這是一個很好的解決方案,但是它利用了這個問題的一個邊緣情況,如果Name不止一次出現,你不會得到相同的結果,我認爲使用'SubString'是一個更好的方法,因爲你知道你的文本從你的文本開始搜索字符串從感謝'Where'子句。 –
感謝Scott的評論 –