【问题标题】:How do I transform a string into a PascalCase string with C#?如何使用 C# 将字符串转换为 PascalCase 字符串?
【发布时间】:2012-01-12 08:18:40
【问题描述】:

我的代码有问题。我不知道我做错了什么。我想让用户写一些句子,然后程序应该将写好的句子分成单个单词,我在数组中每个单词的第一个字符上使用 ToUpper,然后再次将它们连接在一起而没有空格。

我的代码是:

    static void Skrci(string stavek)
    {
        string[] p;
        p = stavek.Split(' ');  // polje separatov

        for (int i = 0; i < p.Length; i++)
        {
            if (p[i].Length > 0)
            {
                char zacetnica = Char.ToUpper(p[i][0]);
                p[i] = p[i].Remove(0, 1);
                p[i] = p[i].Insert(0, zacetnica.ToString());
            }
        }
        stavek = string.Join(" ", p);
    }

    static void Main(string[] args)
    {
        string[] p = null;
        Console.Write("Vpiši nek stavek: ");
        string stavek = Console.ReadLine();
        Skrci(stavek);
        Console.WriteLine(stavek);
        Console.ReadKey(true);
    }

我尝试 Step into 看看我是否能看到问题所在,但我不知道。

【问题讨论】:

  • 所以举个例子说明程序是如何出错的。我们真的不在这里做你的功课。
  • 您收到的错误是什么?
  • 尝试在你的代码中使用英文。它将帮助这里的人们更好地理解它。
  • 我的母语是斯洛文尼亚语,很难用英语写出我需要的东西。
  • @KristyMaitz 您的声誉下降是因为您的问题被否决了。如常见问题解答 (stackoverflow.com/faq#reputation) 中所述,一票反对会从您的声誉中减去两分。否决票可能是因为人们发现您的问题不清楚、很差,或者您可能应该在寻求帮助之前自己进行更多研究。我可以向你推荐 Jon Skeet 写出完美问题的“秘诀”:msmvps.com/blogs/jon_skeet/archive/2010/08/29/…

标签: c# string camelcasing


【解决方案1】:

您的问题是您的函数 Skrci 没有返回值(或者,更新它的参数(通过引用))

这里有一个快速修复

static string Skrci(string stavek)
{
    string[] p;
    p = stavek.Split(' ');  // polje separatov

    for (int i = 0; i < p.Length; i++)
    {
        if (p[i].Length > 0)
        {
            char zacetnica = Char.ToUpper(p[i][0]);
            p[i] = p[i].Remove(0, 1);
            p[i] = p[i].Insert(0, zacetnica.ToString());
        }
    }
    return string.Join(" ", p);
}

static void Main(string[] args)
{
    string[] p = null;
    Console.Write("Vpiši nek stavek: ");
    string stavek = Console.ReadLine();
    stavek = Skrci(stavek);
    Console.WriteLine(stavek);
    Console.ReadKey(true);
}

【讨论】:

  • 是的,它现在可以工作,但我在单词之间有静止空间。句子应该没有空格。
  • 我必须删除 - return string.Join("", p); 之间的空格- 现在它工作正常 - 谢谢 Shai
【解决方案2】:

将字符串转换为 Camel Case 的一种简单方法是自己创建以下扩展方法:

public static String ToCamelCase(this String source)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(source.ToLower());
}

(感谢https://stackoverflow.com/a/1168346/310001

然后你可以简单地这样做:

string stavek = Console.ReadLine().ToCamelCase();

编辑:
如果你想去掉单词之间的空格,当然可以在最后加上.Replace(" ", "")

【讨论】:

  • 我从未使用过 ToCamel.Case——教授从未提及的一种方法。
  • @KristyMaitz ToCamelCase是我自己写的一个方法(如答案所示),在C#语言中是不存在的……当然可以直接写string stavek = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Console.ReadLine().ToLower()) ,但将其包装在一个函数中会更好,更清楚地解释其意图。
【解决方案3】:

您应该将您的字符串作为参考而不是作为值传递给函数。为此使用 ref 关键字。

例子:

static void Skrci(ref string stavek)
    {
        string[] p;
        p = stavek.Split(' ');  // polje separatov

        for (int i = 0; i < p.Length; i++)
        {
            if (p[i].Length > 0)
            {
                char zacetnica = Char.ToUpper(p[i][0]);
                p[i] = p[i].Remove(0, 1);
                p[i] = p[i].Insert(0, zacetnica.ToString());
            }
        }
        stavek = string.Join(" ", p);
    }

    static void Main(string[] args)
    {
        string[] p = null;
        Console.Write("Vpiši nek stavek: ");
        string stavek = Console.ReadLine();
        Skrci(ref stavek);
        Console.WriteLine(stavek);
        Console.ReadKey(true);
    }

【讨论】:

  • ref 通常令人困惑;虽然它非常有用(我经常使用它),但对于 this 场景,简单地返回字符串是更可取的;请参阅 Shai 的回答作为一个很好的例子。另外 - 语义:字符串已经“作为参考”传递;你的意思是传递字符串引用 by reference.
  • 方法对我来说是新的,并且正在学习使用 ref、out 等的正确方法。
  • @KristyMaitz:感谢您的接受,但 Shai 从函数返回字符串的想法听起来确实更好......
【解决方案4】:

如果我理解正确,这就是你想要做的:

    static string Skrci(string stavek)
    {
        string[] p;
        p = stavek.Split(' ');  // polje separatov

        for (int i = 0; i < p.Length; i++)
        {
            if (p[i].Length > 0)
            {
                char zacetnica = Char.ToUpper(p[i][0]);
                p[i] = p[i].Remove(0, 1);
                p[i] = p[i].Insert(0, zacetnica.ToString());
            }
        }
        stavek = string.Join(String.Empty, p);

        return stavek;
    }

    static void Main(string[] args)
    {
        string[] p = null;
        Console.Write("Vpiši nek stavek: ");
        string stavek = Console.ReadLine();
        stavek = Skrci(stavek);
        Console.WriteLine(stavek);
        Console.ReadKey(true);
    }

如果您想连接没有空格的字符串,请不要使用字符串。以“”作为分隔符加入。此外,您没有打印该方法的结果,只是您的输入字符串。

【讨论】:

    【解决方案5】:
     static string Skrci(string stavek)
        {
            string[] p;
            p = stavek.Split(' ');  // polje separatov
    
            for (int i = 0; i < p.Length; i++)
            {
                if (p[i].Length > 0)
                {
                    char zacetnica = Char.ToUpper(p[i][0]);
                    p[i] = p[i].Remove(0, 1);
                    p[i] = p[i].Insert(0, zacetnica.ToString());
                }
            }
            stavek = string.Join("", p);
    
            return stavek;
        }
    
        static void Main(string[] args)
        {
            string[] p = null;
            Console.Write("Vpiši nek stavek: ");
            string stavek = Console.ReadLine();
            stavek = Skrci(stavek);
            Console.WriteLine(stavek);
            Console.ReadKey(true);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-19
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 2015-02-18
      相关资源
      最近更新 更多