如何在 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 循环

在“foreach”循环中获取数组键

如何在Excel Source的foreach循环容器中动态传递excel连接字符串?

关于“foreach循环”中遇到的几个问题总结