#c#
Вопрос:
У меня есть строка, в которой строковые значения разделены специальным символом’;’, и мне нужно разделить строку и сохранить каждое значение в отдельной строке. В моем ipStr ключевые слова, такие как имя сервера, имя базы данных, имена таблиц и имена столбцов, являются идентификаторами, и они не изменятся, могут измениться только значения.
например.
string ipStr = "ServerName=DevTestServer;DBName=CustomerSummary;TableNames=CustomerDetailsamp;OrderDetails;ColumnNames=ID,CustName,OrderID;"
Теперь я хочу разделить значения имя_сервера, ИМЯ_бд, имен таблиц и имен столбцов отдельно и сохранить каждое значение в разных строках. Я попытался ниже, но после поиска имени сервера идентификация части имени базы данных выглядит сложной, а также не похоже на правильный способ кодирования.
string ServerIdentifier = "ServerName=";
string separator = ";";
string serverName = ipStr.Substring(ipStr.IndexOf(ServerIdentifier), ipStr.IndexOf(delimiter));
Каков самый простой способ получения значений, подобных приведенным ниже, из ipStr?
string ServerName="DevTestServer";
string DBName="CustomerSummary";
string TableNames="CustomerDetailsamp;OrderDetails";
string ColumnNames="ID,CustName,OrderID";
Комментарии:
1. Используйте indexOf и храните разделенную строку в каждой переменной.
2. выполните поиск ConnectionStringBuilder — может быть полезно здесь
Ответ №1:
SqlConnectionStringBuilder
не будет работать, потому ServerName
что etc не является допустимым маркером в строке подключения.
Тем не менее, низкотехнологичный подход заключается в использовании старого доброго Split
ToDictionary
var someWeirdStr = "ServerName=DevTestServer;DBName=CustomerSummary;TableNames=CustomerDetailsamp;OrderDetails;ColumnNames=ID,CustName,OrderID;";
var results = someWeirdStr
.Split(';',StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Split('='))
.ToDictionary(x => x[0], x => x.ElementAtOrDefault(1));
Console.WriteLine(results["ServerName"]);
Console.WriteLine(results["DBName"]);
Console.WriteLine(results["TableNames"]);
Console.WriteLine(results["ColumnNames"]);
Выход
DevTestServer
CustomerSummary
CustomerDetailsamp;OrderDetails
ID,CustName,OrderID
Комментарии:
1. Это произойдет после разделения точкой с запятой, в этот момент вам нужно удалить пустые строки.
2. @Общие — строковые разбиения. RemoveEmptyEntries показывает ошибку. Не удается преобразовать из StringSplitOptions. Удалите все элементы в char.
3. @Ask_SO попробуйте
.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries)
, если вы используете более старую версию .net
Ответ №2:
вам нужно разделить строку точкой с запятой, а затем удалить все пустые строки, после чего вы можете снова разделить ее на равные и создать словарь результатов.
string ipStr = "ServerName=DevTestServer;DBName=CustomerSummary;TableNames=CustomerDetailsamp;OrderDetails;ColumnNames=ID,CustName,OrderID;";
var values = ipStr.Split(';')
.Where(x => !string.IsNullOrEmpty(x))
.Select(x => {
var pair = x.Split('=');
return KeyValuePair.Create<string, string>(pair[0], pair[1]);
})
.ToDictionary(pair => pair.Key, pair => pair.Value);
foreach (var i in values) {
Console.WriteLine($"{i.Key}: {i.Value}");
}
Ответ №3:
Вот рабочая демонстрация:
string ipStr = "ServerName=DevTestServer;DBName=CustomerSummary;TableNames=CustomerDetailsamp;OrderDetails;ColumnNames=ID,CustName,OrderID;";
Dictionary<string, string> dict = Regex
.Matches(ipStr, @"s*(?<key>[^;=] )s*=s*((?<value>[^'][^;]*)|'(?<value>[^']*)')")
.Cast<Match>()
.ToDictionary(m => m.Groups["key"].Value,m => m.Groups["value"].Value);
Результат: