2012-09-05 40 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来使用

相关问题