【问题标题】:c# string tricks/features? [closed]c#字符串技巧/功能? [关闭]
【发布时间】:2012-08-02 22:45:14
【问题描述】:

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

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'

【问题讨论】:

  • 您为什么不查看System.StringSystem.Text.StringBuilder 类的文档?
  • @O.R.Mapper 我知道有 StringBuilder;就像我说的那样,通常很容易做到这一点,我正在寻找像我的第一个或第三个例子这样的东西。您不能使用字符串生成器来执行此操作。
  • 您必须编写自己的扩展方法。
  • @AedonEtLIRA:如果您阅读过文档,您就会知道Substring method 与您在第一个示例中展示的完全一样。对于第三个示例,如果您的重复字符串包含多个字符并且扩展方法将是可行的方法,则确实没有单一方法,正如 StackUnderflow 所指出的那样。

标签: c# string


【解决方案1】:

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

【讨论】:

  • cyhicken 可以用if ("something chickin".Contains("chickin")if ("something chickin".IndexOf("chicken") > -1) 完成
  • @oscilatingcretin 是的 - 你只是打电话给String.Contains - 但是这里没有语言级别的支持可以帮助你。
  • @pst 好吧,我认为“in”、乘法和切片表示法都是 Python 中的语言函数(即:它们在 IronPython 或 Jython 等中工作 - 不仅仅是 CPython,而且框架中没有直接支持它)。
  • @ReedCopsey 啊,是的,没想到 IronPython 的感觉..
【解决方案2】:

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

我不明白你怎么能比:

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

对于最后一个,请阅读以下内容:Can I "multiply" a string (in C#)?

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

【讨论】:

  • +1 表示反对 'string' * 5 - 我使用过太多松散类型的语言,它们以导致数据相关错误的方式“帮助”你。奇怪的是,在这些语言中,您必须更加小心处理数据类型以避免意外行为。
【解决方案3】:

第一个问题

你可以使用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。

【讨论】:

  • +1 使用扩展方法。
【解决方案4】:

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

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

【讨论】:

  • 这根本不使用 LINQ。这只是标准的 String.Contains...(它可以工作,但它没有使用任何与 LINQ 相关的东西)
  • 是的,对不起。这是我的第一篇文章......我有一些其他示例,但没有将它们作为代码块插入,所以它抱怨,然后我再次尝试,想出了如何让它接受带有单个代码语句的代码(你看到的那个),现在没有多大意义,但我得到了投票(我认为)所以我不想把它拿下来:)。还有,它不让你把它拿下来,只投票删除?
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2011-05-25
相关资源
最近更新 更多