我一直讨厌字符串解析,这是我在当前项目中做的很多事情。
对于能让我的生活更轻松的字符串,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'
答案 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.String
和System.Text.StringBuilder
做很多事情。扩展方法的可能性几乎是无穷无尽的。如果您有兴趣了解这一切的详细信息,请查看MSDN。
答案 3 :(得分:1)
使用linq,您可以将字符串视为字符列表,并且可以轻松地执行您想要的操作。
var chickenString = "chicken noodle soup";
var hasChicken = chickenString.Contains("chicken");
// hasChicken = true at this point...