使用LINQ和lambdas将字符串放在适当的情况下

时间:2010-04-09 20:43:54

标签: c# linq lambda

我有一个名为ProperCase的函数,它接受一个字符串,然后将每个单词中的第一个字母转换为大写。所以ProperCase(“约翰史密斯”)将返回“约翰史密斯”。这是代码:

    public string ProperCase(string input)
    {
        var retVal = string.Empty;
        var words = input.Split(' ');

        foreach (var word in words)
        {
            if (word.Length == 1)
            {
                retVal += word.ToUpper();
            }
            else if (word.Length > 1)
            {
                retVal += word.Substring(0, 1).ToUpper() + word.Substring(1).ToLower();
            }

            retVal += ' ';
        }

        if (retVal.Length > 0)
        {
            retVal = retVal.Substring(0, retVal.Length - 1);
        }

        return retVal;
    }

这段代码工作得很好,但我很确定我可以用LINQ和lambdas更优雅地完成它。有人可以告诉我怎么样?

3 个答案:

答案 0 :(得分:6)

将输入字符串拆分为单词,将每个单词转换为标题大小写,然后将转换后的单词重新加入:

TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;

string result = string.Join(" ", input.Split(' ')
                                      .Select(word => textInfo.ToTitleCase(word))
                                      .ToArray());

答案 1 :(得分:0)

另一个解决方案是

Regex.Replace(input, @"\b\w", m => m.ToString().ToUpper());

答案 2 :(得分:0)

根据dtb的回答。如果您要在cshtml页面中使用c#剃须刀,并且需要一个衬板:

    lngCounter = Convert.ToInt32(strCounter, 16) + 1
    strCounter = Hex(Convert.ToInt32(lngCounter)).PadLeft(8, "0"c)

    My.Computer.FileSystem.RenameFile(strNextFileCtrName & ".nxt", strCounter & ".nxt")

    Return strNewFileName

或Javascript(可以使用正则表达式,但这很有趣):

@(string.Join(" ", input.ToLower().Split(' ').Select(word => word.Substring(0,1).ToUpper() + word.Substring(1, word.Length - 1)).ToArray() ))