Я часто пишу довольно некрасивый код, когда выполняю строковые манипуляции. Код выполняет то, что ожидалось, но я хотел бы чувствовать себя удовлетворенным тем, как он выглядит так же, как и работает. Существуют ли хорошие книги, сайты, форумы, посвященные распространенным проблемам манипуляции со строками? А как бы вы кодировали следующие примеры сценариев?
Простой сценарий: у меня есть коллекция объектов, для которых я хочу объединить результат определенного метода для каждого объекта и отделить каждую строку с помощью «И».
Этот код помог бы, но он не дает того теплого уютного ощущения, которое вы получите после написания какого-то красивого кода ...;).
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());
}
Возможно, было бы лучше, если бы я использовал лямбда-выражения:
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()));
}