[英]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.