繁体   English   中英

字符串操作模式(使用C#或其他语言)

[英]Patterns for string manipulation (in C# or other languages)

在执行字符串操作时,我经常发现自己编写的代码很难看。 该代码完成了预期的工作,但我希望对其外观和性能感到满意。 有没有什么好的书籍,网站,论坛可以解决常见的字符串操作问题? 以及如何编码以下示例方案?

一个简单的场景:我有一个对象集合,我想将来自每个对象的特定方法的结果连接起来,并用“ AND”分​​隔每个字符串。

这段代码可以解决问题,但是并不能给您编写一段漂亮的代码后那种温暖舒适的感觉。

List<MyClass> myColl = ..... // initialize the collection..
StringBuilder sb = new StringBuilder();
bool isFirst = true;
foreach (MyClass obj in myColl) {
    if (!isFirst) {
        sb.Append(" AND ");
    }
    isFirst = false;
    sb.Append(obj.MyStringBuildingMethod());
}

如果使用lambda表达式,这可能是更好的方法:

List<MyClass> myColl = ..... // initialize the collection..
string result = String.Join(" AND ", myColl.Select(i => i.MyStringBuildingMethod()).ToArray());

现在是一个更复杂的场景:我想在定界符上分割一个字符串,然后将每个部分分割成一个键/值。 该值用单引号引起来,如果定界符在该值内,则不应对此进行分割。 以下代码完成了应有的工作,但感觉就像我用了胶带或其他东西。

string csvString = "name='Andersson, Per',country='Sweden',city='Stockholm'";
Dictionary<string, string> keyValues = new Dictionary<string, string>();

bool isInsideQuote = false;
int lastPosition = 0;
for (int i = 0; i < csvString.Length; i++) {
    if (csvString[i] == ',' && !isInsideQuote) {
        string[] keyValuePair = csvString.Substring(lastPosition, i - lastPosition).Split("=".ToCharArray(), 2);
        if (keyValuePair.Length == 2) {
            keyValues.Add(keyValuePair[0], keyValuePair[1].TrimStart("'".ToCharArray()).TrimEnd("'".ToCharArray()));
        }
        lastPosition = i + 1;
    }

    if (csvString[i] == '\'') {
        isInsideQuote = !isInsideQuote;
    }
}

string[] lastKeyValuePair = csvString.Substring(lastPosition).Split("=".ToCharArray(), 2);
if (lastKeyValuePair.Length == 2) {
    keyValues.Add(lastKeyValuePair[0], lastKeyValuePair[1].TrimStart("'".ToCharArray()).TrimEnd("'".ToCharArray()));
}

您可以使用String.Join(string delimiter, string[] words)方法。 在C#3.0语法中,这可能类似于以下内容:

var words = new string[] 
                      {
                         "this",
                         "that",
                         "the other"
                      };

var concatenatedResult = String.Join(" and ", words);

//should output "this and that and the other"
Console.WriteLine(concatenatedResult);

如果您有一个通用列表,并且想要串联其值,则可以执行以下操作:

var words = new List<object>()
                    {
                      5,
                      DateTime.Now,
                      "something else"
                    };

var concatenatedResult = String.Join(" and ", words.Select(i => i.ToString()).ToArray());
//should output "5 and [system time] and something else"
Console.WriteLine(concatenatedResult);

Console.ReadLine();

请注意,第二个示例是从另一个StackOverflow帖子中摘录的: 将List(of object)转换为List(of string)

我已经看过IL的Join方法,如果不比使用StringBuilder类要快,它的速度应该相当合理。 我想确保String类的实例没有在代码中并置,与OP中显示的方法相比,这将非常慢。

我会为每个记录添加一个And,然后在末尾简单地删除最后一个And ...

List<MyClass> myColl = ..... // initialize the collection..
StringBuilder sb = new StringBuilder();
foreach (MyClass obj in myColl)   
    sb.Append(obj.MyStringBuildingMethod() + " AND ");
string s = sb.ToString(0, sb.Length - 5);

我想这比第二个示例要复杂得多,尽管它依赖于严格格式化的字符串。 字符串解析并不总是很漂亮。

string csvString = "name='Andersson, Per',country='Sweden',city='Stockholm'";

csvString = csvString.Replace("',", "'|");
string[] parts = csvString.Split('|');
foreach (string s in parts)  {
  string[] moreParts = s.Split('=');

  string key = moreParts[0];
  string value = moreParts[1].Trim("'"); 
  // do stuff?
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM