-5

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

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

4 回答 4

4

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

但是,String 类通过方法提供此功能。还有StringBuilder,用于构建基于多个连接的大字符串。

在您的示例中,请参阅String.Substring切片String.Containsin没有像 Python 中的乘法那样简单的“重复”式操作。

话虽如此,制作一个处理乘法功能的扩展方法很容易

于 2012-08-02T22:49:05.400 回答
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"

应得的信用: 如果您的字符串的字符数少于您请求的字符数,此答案可以很好地确保您不会遇到异常。

第二个问题

您可以使用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.String和做很多事情System.Text.StringBuilder。扩展方法的可能性几乎是无穷无尽的。如果您有兴趣了解这一切的来龙去脉,请查看 MSDN。

于 2012-08-03T01:34:18.963 回答
2

它们是不同的语言——语法不同,以这种方式将 C# 与 Python 进行比较在很大程度上是没有意义的。另外,我完全挑战您的断言,即您给出的示例“更容易”。

我不明白你怎么能比:

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

对于最后一个,请阅读以下内容:我可以“乘”一个字符串(在 C# 中)吗?

就个人而言,特别是,我讨厌乘以一个字符串的想法——如果这个值恰好是太多的歧义'5'——将这些功能隐藏在操作符的气味后面。

于 2012-08-02T22:52:05.827 回答
1

使用 linq,您可以将您的字符串视为一个字符列表,并轻松地做您想做的事情。

var chickenString = "chicken noodle soup";
var hasChicken = chickenString.Contains("chicken"); 
// hasChicken = true at this point...
于 2012-08-02T22:51:41.543 回答