【发布时间】:2009-09-09 21:45:34
【问题描述】:
在进行字符串操作时,我经常发现自己编写的代码非常难看。该代码符合预期,但我希望对它的外观和性能感到满意。有没有解决常见字符串操作问题的好书、网站、论坛?您将如何编写以下示例场景的代码?
一个简单的场景:我有一个对象集合,我想将每个对象的特定方法的结果连接起来,并用“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()));
}
【问题讨论】:
标签: c# string design-patterns