c#字符串技巧/功能?

时间:2012-08-02 22:45:15

标签: c# string

我一直讨厌字符串解析,这是我在当前项目中做的很多事情。

对于能让我的生活更轻松的字符串,c#是否具有和技巧或快速功能?特别是裁剪,倍增或子串?这里的最终目标是获取字符串列表并将其转换为漂亮的圆柱结构。很容易,但仍然,我会很容易python。

例如,python有:

>>> a = "I once was a string, then I got mutilated"
>>> print a[20:]
then I got mutilated

>>> 'chicken' in 'chicken noodle soup'
True

或最后

>>> 'lol' * 5
'lollollollollol'

4 个答案:

答案 0 :(得分:4)

在C#中没有与此相关的语言相关功能,就像在Python中一样。唯一真正的带有字符串的C#语言功能允许将+映射到String.Concat,以简化(并保持高效)"a" + "b" + "c"语句。

然而,String class通过方法提供此功能。还有StringBuilder,用于根据多个连接构建大型字符串。

在您的示例中,请String.Substring查看切片,String.Contains查看in。没有简单的“重复”样式操作,如Python中的乘法。

话虽如此,它是easy to make an extension method which handles the multiply functionality

答案 1 :(得分:2)

它们是不同的语言 - 语法不同,以这种方式将C#与Python进行比较在很大程度上是没有意义的。此外,我完全质疑你的断言,你给出的例子“更容易”。

我不知道你怎么能比以前容易得多:

Console.WriteLine("Foo".Substring(1)); //<-- prints 'oo'
Console.WriteLine("chicken noodle soup".Contains("chicken")
                  .ToString()); //<-- prints 'true'

对于最后一个,请阅读此SO:Can I "multiply" a string (in C#)?

就个人而言,我特别讨厌乘以一个字符串的想法 - 如果该值恰好是'5'则太多歧义 - 将这些功能隐藏在运算符之后。

答案 2 :(得分:2)

第一个问题

您可以使用String.SubString()

string a = "I once was a string, then I got mutilated";
string lastTwentyCharactersOfA = a.Substring(Math.Max(0, a.Length - 20));
// returns "then I got mutilated"

信用到期的信用:如果您的字符串的字符少于您请求的字符数,This answer可以确保您不会收到异常。

第二个问题

您可以使用String.Contains()

string soup = "chicken noodle soup";
bool soupContainsChicken = soup.Contains("chicken");  // returns True

第三个问题

您无法覆盖String类的乘法运算符。这是一个密封的类,当然你无权访问源代码,使它成为partial类或类似的东西。您有几个选项可以让您接近您想要做的事情。一种是编写扩展方法:

public static string MultiplyBy(this string s, int times)
{
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < times; i++)
    {
        sb.Append(s);
    }

    return sb.ToString();
}

用法:

string lol = "lol";
string trololol = lol.MultiplyBy(5);  // returns "lollollollollol"

或者如果你想要去运算符重载的路径,你可以编写一个自定义String类的类,然后就可以了。

public struct BetterString  // probably not better than System.String at all
{
    public string Value { get; set; }

    public static BetterString operator *(BetterString s, int times)
    {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < times; i++)
        {
            sb.Append(s.Value);
        }

        return new BetterString { Value = sb.ToString() };
    }
}

用法:

BetterString lol = new BetterString { Value = "lol" };
BetterString trololol = lol * 5;  // trololol.Value is "lollollollollol"

一般情况下,您可以使用System.StringSystem.Text.StringBuilder做很多事情。扩展方法的可能性几乎是无穷无尽的。如果您有兴趣了解这一切的详细信息,请查看MSDN。

答案 3 :(得分:1)

使用linq,您可以将字符串视为字符列表,并且可以轻松地执行您想要的操作。

var chickenString = "chicken noodle soup";
var hasChicken = chickenString.Contains("chicken"); 
// hasChicken = true at this point...