如何在 C# 中连接由 foreach 循环大写的文本?
Posted
技术标签:
【中文标题】如何在 C# 中连接由 foreach 循环大写的文本?【英文标题】:How can I concatenate a text capitalized by a foreach loop in C#? 【发布时间】:2022-01-23 19:11:45 【问题描述】:using System;
class Program
public static void Main (string[] args)
string Text = "the sentence which each word must be capitalized";
string[] WordArray = new string[8];
foreach (string Word in Text.Split(' '))
string CapitalizedFirstLetter = Word.Substring(0, 1).ToUpper();
string RestOfWord = Word.Substring(1, Word.Length-1);
string ConcatenatedWord = string.Concat(CapitalizedFirstLetter, RestOfWord);
我打算将每个单词大写并再次连接,但我无法连接它。 我应该如何连接它?
【问题讨论】:
StringBuilder
,或将其添加到List<string>
并使用string.Join
。
你能解释一下是什么阻止你连接它们吗?即使string newString = aString + bString;
是有效的C#,所以我不明白最基本的问题是什么。
您已经初始化了string[] WordArray
,为什么不将ConcatentatedWord
添加到数组中适当的索引处,然后在您的foreach
循环完成后将string.Join
添加到数组中?
你正在清除 ConcatenatedWord 在每个循环中(当你一次又一次地用每个单词定义它,当然你也没有,t 连接到最后的任何短语
【参考方案1】:
@Ufuk
如果您期望这个输出“每个单词必须大写的句子”。然后你的代码看起来不错。你已经完成了 95% 的工作。已经用大写字母拆分,但您需要将它们存储在某个地方。 所以我创建了一个字符串变量来存储它们。我只写了两行。
class Program
public static void Main (string[] args)
string Text = "the sentence which each word must be capitalized";
string outputText="";
foreach (string Word in Text.Split(' '))
string CapitalizedFirstLetter = Word.Substring(0, 1).ToUpper();
string RestOfWord = Word.Substring(1, Word.Length-1);
string ConcatenatedWord = string.Concat(CapitalizedFirstLetter, RestOfWord);
outputText = outputText + " " + ConcatenatedWord ;
【讨论】:
【参考方案2】:一种稍微不优雅的方法是跟踪列表中的所有单词,然后在最后加入。
using System;
using System.Collections.Generic;
class Program
public static void Main (string[] args)
string Text = "the sentence which each word must be capitalized";
string[] WordArray = new string[8]; //Unused
List<string> WordsCapitalized = new(); //New line
foreach (string Word in Text.Split(' '))
string CapitalizedFirstLetter = Word.Substring(0, 1).ToUpper();
string RestOfWord = Word.Substring(1, Word.Length-1);
string ConcatenatedWord = string.Concat(CapitalizedFirstLetter, RestOfWord);
WordsCapitalized.Add(ConcatenatedWord); //new line
string FinalString = String.Join(" ", WordsCapitalized); //" " is delimiter between words
这是在您发布的代码的基础上构建的,只是为了展示一种简单的方法。我不一定会从头开始处理这个问题。如果这是我的代码,我至少会清理它并减少这种方法中的变量数量。
【讨论】:
【参考方案3】:我建议使用正则表达式:
using System.Text.RegularExpressions;
...
string Text = "the sentence which (each!) word must BE capitalized";
string result = Regex.Replace(Text,
@"\b\pLl\pL*\b",
match =>
string word = match.Value;
//TODO: Some logic if we want to capitalize the word
// if (...) return word;
return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word);
);
Console.Write(result);
结果:
The Sentence Which (Each!) Word Must BE Capitalized
注意,BE
被保留,(each!)
被转换为 (Each!)
模式解释:
\b - word boundary
\pLl - low case letter
\pL* - zero or more letters
\b - word boundary
【讨论】:
【参考方案4】:你可以试试这个
string text = "the sentence which each word must be capitalized";
var words = text.Split(" ");
for (var i = 0; i < words.Length; i++) words[i] =
Char.ToUpper(words[i][0]).ToString()+words[i].Substring(1);
text = string.Join(" ", words);
【讨论】:
【参考方案5】:以防万一,你可以这样做:
string Text = "the sentence which each word must be capitalized";
Console.WriteLine(CultureInfo.InvariantCulture.TextInfo.ToTitleCase(Text));
输出:
The Sentence Which Each Word Must Be Capitalized
【讨论】:
不幸的是,TextInfo.ToTitleCase
是一个非常生硬的工具,它不尊重 停用词(如“a”、“the” , "in" 等)在标题大小写中呈现时不应大写。
@scor4er 这是一个很好的参考信息,但原始问题的代码和文本也不尊重停用词。
@Dai 同意,但在这种情况下,我认为操作人员正在寻找这种行为以上是关于如何在 C# 中连接由 foreach 循环大写的文本?的主要内容,如果未能解决你的问题,请参考以下文章
如何打破嵌套的foreach循环然后转到c#上的父foreach循环
@foreach 循环中的多种形式。如何使用 javascript 异步提交一个。 C# 核心剃刀
c# razor mvc textboxfor in foreach 循环