天道酬勤,学无止境

c#string.replace in foreach 循环(c# string.replace in foreach loop)

问题

不知何故,我似乎无法在 C# 的 foreach 循环中进行字符串替换来工作。 我的代码如下:

foreach (string s in names)
{
    s.Replace("pdf", "txt");
}

我对 LINQ 还是很陌生,所以如果这听起来很业余,请原谅我;)

回答1

你说你在追求 LINQ 解决方案……这很简单:

var replacedNames = names.Select(x => x.Replace("pdf", "txt"));

我们不知道names的类型,但是如果您想重新分配给它,您可以使用ToArrayToList

// If names is a List<T>
names = names.Select(x => x.Replace("pdf", "txt")).ToList();
// If names is an array
names = names.Select(x => x.Replace("pdf", "txt")).ToArray();

您应该知道,您发布的代码目前根本没有使用 LINQ...

回答2

C# 中的字符串是不可变的(不会改变),因此s.Replace将返回一个新字符串。 不幸的是,这意味着您不能使用foreach进行更新。 如果名称是一个数组,这应该可以工作:

for(int i = 0; i < names.Length; i++)
{
    names[i] = names[i].Replace("pdf", "txt");
}
回答3

正如其他人所提到的,您需要使用for循环来就地执行此操作。 但是,如果您不需要就地完成操作(即结果可以是不同的集合),那么您也可以将其作为 linq 查询来执行,例如

var results = from name in names select name.Replace("pdf", "txt");

不过有一件事 - 看起来您正在尝试更改某些文件名的扩展名。 如果这就是您想要做的,那么我建议您使用专门为此目的设计的 Path.ChangeExtension。

var results = from name in names select Path.ChangeExtension(name, "txt");
回答4

s.Replace 是一个函数,所以你会喜欢 s=s.Replace().. 虽然最好使用 StringBuilder。 (见上面的答案)

回答5

为什么要使用replace,这会使应用程序变慢。 使用正则表达式:

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.replace.aspx

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 替换C#字符串中的多个字符(Replace multiple characters in a C# string)
    问题 有替代字符串的更好方法吗? 令我惊讶的是,Replace不包含字符数组或字符串数​​组。 我想我可以编写自己的扩展名,但我很好奇是否有更好的内置方法可以执行以下操作? 请注意,最后一个Replace是字符串而不是字符。 myString.Replace(';', '\n').Replace(',', '\n').Replace('\r', '\n').Replace('\t', '\n').Replace(' ', '\n').Replace("\n\n", "\n"); 回答1 您可以使用替换正则表达式。 s/[;,\t\r ]|[\n]{2}/\n/g s/开头表示搜索 [和]之间的字符是要搜索的字符(任何顺序) 第二个/分隔搜索文本和替换文本 用英语,这是: “搜索;或,或\t或\r或 (空格)或两个连续的\n并将其替换为\n “ 在C#中,您可以执行以下操作:(在导入System.Text.RegularExpressions ) Regex pattern = new Regex("[;,\t\r ]|[\n]{2}"); pattern.Replace(myString, "\n"); 回答2 如果您感觉特别聪明并且不想使用正则表达式: char[] separators = new char[]{' ',';',',','\r','\t','\n'}
  • c# string.replace in foreach loop
    Somehow I can't seem to get string replacement within a foreach loop in C# to work. My code is as follows : foreach (string s in names) { s.Replace("pdf", "txt"); } Am still quite new to LINQ so pardon me if this sounds amateurish ;)
  • 重命名文件夹C#中的文件(Renaming files in folder c#)
    问题 我的文件夹中有超过1000个文件,其名称类似于abc_1,abc_2 ... abc_n 我想从所有文件中删除此前缀“ abc_”。 因为有1000多个,所以任何不手动执行此操作的机会都会很痛苦。 如何使用c#做到这一点? 回答1 您可以尝试使用此代码 DirectoryInfo d = new DirectoryInfo(@"C:\DirectoryToAccess"); FileInfo[] infos = d.GetFiles(); foreach(FileInfo f in infos) { File.Move(f.FullName, f.FullName.Replace("abc_","")); } 回答2 您可以使用File.Move和String.Substring(index): var prefix = "abc_"; var rootDir = @"C:\Temp"; var fileNames = Directory.EnumerateFiles(rootDir, prefix + "*", SearchOption.AllDirectories); foreach(String path in fileNames) { var dir = Path.GetDirectoryName(path); var fileName = Path
  • 替换列表中的字符串值(Replace string values in list)
    问题 我有一个字符串集合,其中包含“ goalXXvalue,goalXXLength,TestXX”之类的值。 这是一个List(of String),我认为我可以遍历每个项目并替换为我使用下面的方法尝试过的XX值,但这些值不会改变。 我要去哪里错了? 谢谢 metricList.ForEach(Function(n) n.Replace("XX", "1")) 回答1 您在这里遇到一些问题: 首先,字符串是不可变的,因此当您调用.Replace时,您将返回一个新字符串。 调用n.Replace不会修改n 。 在匿名函数中分配给n不会影响列表中的值。 无论采用上述哪种方法,枚举时都不能更改集合的内容,因为它将使枚举无效。 由于您似乎要更改列表中的每个字符串,因此似乎无需尝试就地修改集合。 因此,简洁的解决方案是使用Linq创建一个新列表: var newList = metricList.Select(s => s.Replace("XX", "1")).ToList(); 回答2 问题:您对替换字符串不做任何事情。 您可以使用一个简单的循环轻松地做到这一点: C# for(int i = 0; i < metricList.Count; i++) { metricList[i] = metricList[i].Replace("XX", "1"); } VB.NET For i
  • C#中的命名字符串格式(Named string formatting in C#)
    问题 有什么方法可以通过名称而不是在C#中的位置来格式化字符串? 在python中,我可以执行以下示例(从这里无耻地被盗): >>> print '%(language)s has %(#)03d quote types.' % \ {'language': "Python", "#": 2} Python has 002 quote types. 在C#中有什么方法可以做到这一点? 例如说: String.Format("{some_variable}: {some_other_variable}", ...); 能够使用变量名来做到这一点会很好,但是字典也是可以接受的。 回答1 没有内置的方法来处理此问题。 这是一种方法 string myString = "{foo} is {bar} and {yadi} is {yada}".Inject(o); 这是另一个 Status.Text = "{UserName} last logged in at {LastLoginDate}".FormatWith(user); 第三种改进的方法,部分基于上述两种方法,来自Phil Haack 回答2 我有一个刚刚发布到我的博客的实现:http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing
  • 清洁绳子? 有没有更好的方法呢?(Clean the string? is there any better way of doing it?)
    问题 我正在使用这种方法来清理字符串 public static string CleanString(string dirtyString) { string removeChars = " ?&^$#@!()+-,:;<>’\'-_*"; string result = dirtyString; foreach (char c in removeChars) { result = result.Replace(c.ToString(), string.Empty); } return result; } 这种方法工作正常......但是这种方法存在性能故障。 每次我传递字符串时,每个字符都会进入循环,如果我有一个大字符串,那么返回对象将花费太多时间。 有没有其他更好的方法来做同样的事情? 就像在 LINQ 或 JQUERY/Javascript 中一样 任何建议将不胜感激。 回答1 好的,请考虑以下测试: public class CleanString { //by MSDN http://msdn.microsoft.com/en-us/library/844skk0h(v=vs.71).aspx public static string UseRegex(string strIn) { // Replace invalid characters with empty
  • Inlining CSS in C#
    I need to inline css from a stylesheet in c#. Like how this works. http://www.mailchimp.com/labs/inlinecss.php The css is simple, just classes, no fancy selectors. I was contemplating using a regex (?<rule>(?<selector>[^{}]+){(?<style>[^{}]+)})+ to strip the rules from the css, and then attempting to do simple string replaces where the classes are called, but some of the html elements already have a style tag, so I'd have to account for that as well. Is there a simpler approach? Or something already written in c#? UPDATE - Sep 16, 2010 I've been able to come up with a simple CSS inliner
  • 在C#中内联CSS(Inlining CSS in C#)
    问题 我需要从c#中的样式表内联css。 喜欢这是如何工作的。 http://www.mailchimp.com/labs/inlinecss.php CSS很简单,只有类,没有花哨的选择器。 我正在考虑使用正则表达式(?<rule>(?<selector>[^{}]+){(?<style>[^{}]+)})+从CSS中剥离规则,然后尝试要在调用类的位置进行简单的字符串替换,但是某些html元素已经具有样式标签,因此我也必须考虑这一点。 有没有更简单的方法? 还是已经用C#编写的东西? 更新-2010年9月16日 只要您的html也是有效的xml,我就能提出一个简单的CSS内联代码。 它使用正则表达式来获取<style />元素中的所有样式。 然后将css选择器转换为xpath表达式,并在任何预先存在的内联样式之前将内联样式添加到匹配的元素中。 请注意,CssToXpath尚未完全实现,有些事情它尚无法实现...。 CssInliner.cs using System.Collections.Generic; using System.Text.RegularExpressions; using System.Xml.Linq; using System.Xml.XPath; namespace CssInliner { public class CssInliner {
  • 从C#字符串中删除字符(Remove characters from C# string)
    问题 如何删除字符串中的字符? 例如: "My name @is ,Wan.;'; Wan" 。 我想从该字符串中删除字符'@', ',', '.', ';', '\'' ,以使其变为"My name is Wan Wan" 回答1 var str = "My name @is ,Wan.;'; Wan"; var charsToRemove = new string[] { "@", ",", ".", ";", "'" }; foreach (var c in charsToRemove) { str = str.Replace(c, string.Empty); } 但是如果您想删除所有非字母字符,我可能会建议另一种方法 var str = "My name @is ,Wan.;'; Wan"; str = new string((from c in str where char.IsWhiteSpace(c) || char.IsLetterOrDigit(c) select c ).ToArray()); 回答2 简单的: String.Join("", "My name @is ,Wan.;'; Wan".Split('@', ',' ,'.' ,';', '\'')); 回答3 听起来像RegEx的理想应用程序-一种用于快速文本操作的引擎。 在这种情况下: Regex
  • 替换C#中的多个字符串元素(Replace Multiple String Elements in C#)
    问题 有没有更好的办法做到这一点... MyString.Trim().Replace("&", "and").Replace(",", "").Replace(" ", " ") .Replace(" ", "-").Replace("'", "").Replace("/", "").ToLower(); 我已经扩展了字符串类,以将其简化为一项工作,但是有一种更快的方法吗? public static class StringExtension { public static string clean(this string s) { return s.Replace("&", "and").Replace(",", "").Replace(" ", " ") .Replace(" ", "-").Replace("'", "").Replace(".", "") .Replace("eacute;", "é").ToLower(); } } 只是为了好玩(并停止评论中的论点),我已提拔要点,对下面的各种示例进行基准测试。 https://gist.github.com/ChrisMcKee/5937656 regex选项的得分非常高; 字典选项出现最快; stringbuilder replace的长发版本比短手版本要快一些。 回答1 更快-不更有效-是的
  • 在C#中将换行符添加到字符串中(Adding a newline into a string in C#)
    问题 我有一个字符串。 string strToProcess = "fkdfdsfdflkdkfk@dfsdfjk72388389@kdkfkdfkkl@jkdjkfjd@jjjk@"; 我需要在字符串中每次出现“ @”符号后添加换行符。 我的输出应该是这样的 fkdfdsfdflkdkfk@ dfsdfjk72388389@ kdkfkdfkkl@ jkdjkfjd@ jjjk@ 回答1 随时在任何字符串中使用Environment.NewLine 。 一个例子: string text = "fkdfdsfdflkdkfk@dfsdfjk72388389@kdkfkdfkkl@jkdjkfjd@jjjk@"; text = text.Replace("@", "@" + System.Environment.NewLine); 回答2 您可以在@符号后添加新的换行符,如下所示: string newString = oldString.Replace("@", "@\n"); 您还可以在Environment类中使用NewLine属性(我认为它是环境)。 回答3 前面的答案接近,但是要满足@符号保持接近的实际要求,您希望将其设置为str.Replace("@", "@" + System.Environment.NewLine) 。 这将保留@符号
  • 替代多个String.Replaces [重复](Alternative to multiple String.Replaces [duplicate])
    问题 这个问题已经在这里有了答案: 替换C#中的多个字符串元素(8个答案) 3年前关闭。 我的代码连续使用String.Replace多次: mystring = mystring.Replace("somestring", variable1); mystring = mystring.Replace("somestring2", variable2); mystring = mystring.Replace("somestring3", variable1); 我怀疑有更好,更快的方法。 你有什么建议? 回答1 对于“简单”的选择,只需使用StringBuilder。 StringBuilder sb = new StringBuilder("11223344"); string myString = sb .Replace("1", string.Empty) .Replace("2", string.Empty) .Replace("3", string.Empty) .ToString(); 回答2 我们是否正在寻找使这种情况难以理解的方法? 如果是这样,正则表达式是您的朋友 var replacements = new Dictionary<string,string>() { {"somestring",someVariable1}, {"anotherstring"
  • 如何循环匹配正则表达式的所有元素?(How to loop all the elements that match the regex?)
    问题 就是这种情况:我想找到与正则表达式匹配的元素。 targetText =“ SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext” 我像这样在javascript中使用正则表达式 reg = new RegExp(/e(.*?)e/g); var result = reg.exec(targetText); 而我只能得到第一个,但是不能得到。。。我只能得到T1,但是不能得到T2,T3…… 回答1 var reg = /e(.*?)e/g; var result; while((result = reg.exec(targetText)) !== null) { doSomethingWith(result); } 回答2 三种方法取决于您要使用的方法: 循环遍历每个匹配项:.match targetText.match(/e(.*?)e/g).forEach((element) => { // Do something with each element }); 循环浏览并即时替换每个匹配项:.replace const newTargetText = targetText.replace(/e(.*?)e/g, (match, $1) => { // Return the replacement leveraging
  • 在c#中删除列表中所有字符串中的特定字符(Remove specific char in all strings in a list in c#)
    问题 我在列表中有一些字符串,它们是 KHIJEFGACDB KHIJEFGBACD KHIJEFGBCDA KHIJEFGCDAB KHIJEFGCDBA KHIJGABCDEF KHIJGABEFCD KHIJGACDBEF KHIJGACDEFB KHIJGAEFBCD KHIJGAEFCDB KHIJGBACDEF KHIJGBAEFCD 我需要删除列表中所有字符串中可用的HIJ 。 我做了一个像下面这样的 C# 程序 foreach (string item in items) { item.Replace("HIJ", ""); } Console.WriteLine(items.FirstOrDefault().Length); 但它仍然显示 11,这意味着 HIJ 没有被移除。 如何解决这个问题并得到 8 作为答案。 回答1 字符串在 C# 中是不可变的。 尝试 for (int i = 0; i < items.Length; i++) items[i] = items[i].Replace("HIJ", ""); 还要注意内 foreach (string item in items) item不能修改。 而且,顺便说一句,foreach不能用于从源集合中添加或删除项目,以避免不可预测的副作用。 请参阅 http://msdn.microsoft.com/en
  • C#字符串替换为字典(C# String replace with dictionary)
    问题 我有一个字符串,需要在上面进行一些替换。 我有一个Dictionary<string, string> ,其中定义了搜索替换对。 我创建了以下扩展方法来执行此操作: public static string Replace(this string str, Dictionary<string, string> dict) { StringBuilder sb = new StringBuilder(str); return sb.Replace(dict).ToString(); } public static StringBuild Replace(this StringBuilder sb, Dictionary<string, string> dict) { foreach (KeyValuePair<string, string> replacement in dict) { sb.Replace(replacement.Key, replacement.Value); } return sb; } 有更好的方法吗? 回答1 如果数据是标记化的(即“亲爱的$ name $,从$ date $开始,您的余额为$ amount $”),那么Regex可能会有用: static readonly Regex re = new Regex(@"\$(\w+)\$"
  • 在C#中的foreach循环中更新Struct(Update Struct in foreach loop in C#)
    问题 我有以下代码(C#): using System.Collections.Generic; namespace ConsoleApplication1 { public struct Thing { public string Name; } class Program { static void Main(string[] args) { List<Thing> things = new List<Thing>(); foreach (Thing t in things) // for each file { t.Name = "xxx"; } } } } 它不会编译。 错误是: Cannot modify members of 't' because it is a 'foreach iteration variable' 但是,如果将Thing更改为class而不是struct ,它将进行编译。 请有人可以解释发生了什么吗? 回答1 它或多或少说了什么,编译器不允许您在foreach中更改循环var(的一部分)。 只需使用: for(int i = 0; i < things.Count; i+= 1) // for each file { things[i].Name = "xxx"; } 它在Thing是类时起作用,因为循环var是引用,并且您只对引用的对象进行更改
  • C#:List的任何好处 .ForEach(...)遍历普通的foreach循环?(C#: Any benefit of List<T>.ForEach(…) over plain foreach loop?)
    问题 我想知道为什么List<T>.ForEach(Action<T>)存在。 这样做有什么好处/不同之处: elements.ForEach(delegate(Element element){ element.DoSomething(); }); 超过 foreach(Element element in elements) { element.DoSomething();} ? 回答1 与.ForEach方法的主要不同之处在于,您可以修改基础集合。 使用foreach语法,如果这样做,您将获得异常。 这是一个示例(并非完全美观,但可以使用): static void Main(string[] args) { try { List<string> stuff = new List<string>(); int newStuff = 0; for (int i = 0; i < 10; i++) stuff.Add("."); Console.WriteLine("Doing ForEach()"); stuff.ForEach(delegate(string s) { Console.Write(s); if (++newStuff < 10) stuff.Add("+"); // This will work fine and you will continue to
  • PowerShell多字符串替换效率(PowerShell multiple string replacement efficiency)
    问题 我正在尝试在一个非常大的30Mb +文本文件中替换600个不同的字符串。 我当前正在构建一个执行此操作的脚本; 遵循此问题: 脚本: $string = gc $filePath $string | % { $_ -replace 'something0','somethingelse0' ` -replace 'something1','somethingelse1' ` -replace 'something2','somethingelse2' ` -replace 'something3','somethingelse3' ` -replace 'something4','somethingelse4' ` -replace 'something5','somethingelse5' ` ... (600 More Lines...) ... } $string | ac "C:\log.txt" 但这会检查每行600次,并且文本文件中的行数超过150,000+,这意味着需要大量的处理时间。 有没有更好的替代方法可以做到这一点呢? 回答1 因此,您要说的是要替换150,000行中的每行600个字符串,并且希望每行运行一次replace操作? 是的,有一种方法可以做到这一点,但是在PowerShell中却没有,至少我没有想到。 可以在Perl中完成。 方法:
  • 如何替换字符串的某些部分?(How do I replace certain parts of my string?)
    问题 如何用另一部分替换字符串的特定部分? 输入字符串: "Hello, my name is Santa" 我怎样才能改变这一切a “在我的字符串,别的东西吗? 我认为我需要一个foreach循环,但不确定如何使用它。 回答1 strtr ($str, array ('a' => '<replacement>')); 或者更精确地回答您的问题: strtr ("Hello, my name is Santa", array ('a' => '<replacement>')); 回答2 搜索和替换 有几种不同的函数/方法可以将字符串的某个部分替换为其他内容,它们都有自己的优势。 ## str_replace()方法(二进制安全;区分大小写) 争论 混合str_replace(混合$ search ,混合$ replace ,混合$ subject [,int&$ count]) 在上面的定义中可以看到, str_replace()具有3个必需的参数,具有正确的顺序,所有这些参数都可以将字符串以及数组作为参数! 搜索和替换 搜索(字符串)和替换(字符串) →用替换字符串替换搜索字符串。 搜索(数组)和替换(字符串) →用替换字符串替换所有搜索元素。 搜索(字符串)和替换(数组) →引发通知:“注意:数组到字符串的转换”,因为仅一个搜索字符串的替换数组是没有意义的
  • C#5.0中的捕获的闭包(循环变量)(Captured Closure (Loop Variable) in C# 5.0)
    问题 在C#5.0中可以正常运行(意味着达到预期): var actions = new List<Action>(); foreach (var i in Enumerable.Range(0, 10)) { actions.Add(() => Console.WriteLine(i)); } foreach (var act in actions) act(); 打印0到9。但是此显示10表示10次: var actions = new List<Action>(); for (var i = 0; i < 10; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (var act in actions) act(); 问题:这是我们在5.0之前的C#版本中遇到的一个问题。 因此我们必须使用局部循环占位符进行关闭,并且现在已在C#5.0中的“ foreach”循环中对其进行了修复。 但不要在“ for”循环中! 这背后的原因是什么(也无法解决for循环的问题)? 回答1 这背后的原因是什么? 我将假设您的意思是“为什么还没有为for循环更改它?” 答案是对于for循环,现有行为是完全合理的。 如果将for循环分为: 初始化器健康)状况迭代器身体 ...那么循环大致是: { initializer; while