【问题标题】:Replace Upper case letters with Lower case - and vice versa [duplicate]用小写替换大写字母-反之亦然[重复]
【发布时间】:2019-01-03 03:53:26
【问题描述】:

输入字符串:“这是一个字符串” 输出“ t这是一个字符串

我能够将大写字母转换为小写字母,但不知何故我无法链接它们:(。

这是我的代码.. 有人可以帮我吗?

static void Main()
{
    string lstr = "";
    string ustr = "";
    Console.WriteLine("Enter the string");
    string str = Console.ReadLine();

    char[] strchararr = str.ToCharArray();

    for (int i = 0; i < strchararr.Length; i++)
    {

        if (strchararr[i]>='a'&& strchararr[i]<='z')
        {
            ustr += char.ToUpper(strchararr[i]);

        }

        else if (strchararr[i] >= 'A' && strchararr[i] <= 'Z')
        {
            lstr+=char.ToLower(strchararr[i]);
        }
    }
}

【问题讨论】:

  • 你是什么意思but somehow I'm not able to link them
  • 检查Char.IsUpperChar.IsLower,然后使用Char.ToUpper()Char.ToLower()

标签: c# string


【解决方案1】:

使用 linq

var converted = str.Select(x => char.IsUpper(x) ? char.ToLower(x) : char.ToUpper(x));
var result = new string(converted.ToArray);

foreach 方法

foreach (var c in str)
   if (char.IsUpper(c))
      result += char.ToLower(c);
   else 
      result += char.ToUpper(c);

foreach (var c in str)
    result += char.IsUpper(c) ? char.ToLower(c) : char.ToUpper(c);

for 循环

for (int i = 0; i < str.Length; i++)
   if (char.IsUpper(str[i]))
      result += char.ToLower(str[i]);
   else 
      result += char.ToUpper(str[i]);

for (var i = 0; i < str.Length; i++)
     result += char.IsUpper(str[i]) ? char.ToLower(str[i]) : char.ToUpper(str[i]);

或者一个可笑的愚蠢(但超级高效)unsafe 指针版本(仅限 ASCII)

fixed (char* cStr = str)
   for (var c = cStr; c < cStr + str.Length; c++)
     *c = (char)(*c >= 'A' && *c <= 'Z' ? *c + 32 : *c >= 'a' && *c <= 'z' ? *c - 32 : *c);

【讨论】:

  • result += - 你真的在循环中将字符附加到字符串吗?
  • @AntonínLejsek 不,紧张地环顾四周
【解决方案2】:

您的代码有一些问题。

您正在使用两个字符串 ustrlstr。您应该改为使用单个字符串来存储结果,并将char.ToLowerchar.ToUpper 的结果附加到该字符串。

除了 A-Z 和 a-z 之外,您也没有处理其他任何事情。您应该添加一个 else 块来添加任何字符(无需转换)。

    char[] strchararr = str.ToCharArray();

    for (int i = 0; i < strchararr.Length; i++)
    {

        if (strchararr[i]>='a'&& strchararr[i]<='z')
        {
            finalString += char.ToUpper(strchararr[i]);

        }

        else if (strchararr[i] >= 'A' && strchararr[i] <= 'Z')
        {
            finalString+=char.ToLower(strchararr[i]);
        } else {
            finalString += strchararr[i];
        }
    }

    Console.WriteLine(finalString);

如果您想处理来自其他字母(例如西里尔文、希腊文)的字母,您应该使用char.IsLowerchar.IsUpper 来检查大小写。

【讨论】:

  • 非常感谢您的帮助和解释。这完全有道理..
  • @Ash0214 请考虑通过单击该复选标记来接受您认为最好的答案!
【解决方案3】:

“链接它们”我想你的意思是你如何得到一个完整的结果字符串? 在这种情况下,不需要同时使用 lstr 和 ustr 变量,只使用一个。

例如: 换行

        ustr += char.ToUpper(strchararr[i]);

        lstr += char.ToUpper(strchararr[i]);

【讨论】:

    【解决方案4】:

    使用 char 作为数字:
    当所有字符在256 下都有CodePoints 时适用。

    StringBuilder sb = new StringBuilder(input.Length);
    foreach (char c in input)
        sb.Append(!char.IsLetter(c) ? c : c < 97 ? (char)(c + 32) : (char)(c - 32));
    

    【讨论】:

      猜你喜欢
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 2013-09-21
      • 2017-01-26
      • 1970-01-01
      • 2022-01-08
      • 2018-04-01
      相关资源
      最近更新 更多