В C#: добавление кавычек вокруг строки в списке строк, разделенных запятыми
Это, вероятно, имеет простой ответ, но мне не хватило кофе, чтобы понять это самостоятельно:
Если бы у меня была запятая строка, такая как:
string list = "Fred,Sam,Mike,Sarah";
Как получить каждый элемент, добавить кавычки вокруг него и вставить его обратно в строку, например:
string newList = "'Fred','Sam','Mike','Sarah'";
Я предполагаю, что итерации по каждому из них будут началом, но я был озадачен после этого.
Одно уродливое решение:
int number = 0;
string newList = "";
foreach (string item in list.Split(new char[] {','}))
{
if (number > 0)
{
newList = newList + "," + "'" + item + "'";
}
else
{
newList = "'" + item + "'";
}
number++;
}
17 ответов
string s = "A,B,C";
string replaced = "'"+s.Replace(",", "','")+"'";
Спасибо за комментарии, я пропустил внешние цитаты.
Конечно... если бы источником была пустая строка, вы хотели бы добавить дополнительные кавычки или нет? А что, если на входе была куча пробелов...? Я имею в виду, чтобы дать 100% полное решение, я бы, вероятно, попросил список модульных тестов, но я надеюсь, что мой инстинкт инстинкт ответил на ваш основной вопрос.
Обновление: также была предложена альтернатива на основе LINQ (с дополнительным преимуществом использования String.Format и, следовательно, без необходимости беспокоиться о ведущих / конечных кавычках):
string list = "Fred,Sam,Mike,Sarah";
string newList = string.Join(",", list.Split(',').Select(x => string.Format("'{0}'", x)).ToList());
Следуя приведенному выше примеру Джона Скита, это то, что сработало для меня. У меня уже был List<String>
переменная с именем __messages, так что это то, что я сделал:
string sep = String.Join(", ", __messages.Select(x => "'" + x + "'"));
string[] bits = list.Split(','); // Param arrays are your friend
for (int i=0; i < bits.Length; i++)
{
bits[i] = "'" + bits[i] + "'";
}
return string.Join(",", bits);
Или вы можете использовать LINQ, особенно с версией String.Join, которая поддерживает IEnumerable<string>
...
return list.Split(',').Select(x => "'" + x + "'").JoinStrings(",");
В SO в других местах есть реализация JoinStrings... Я поищу ее.
РЕДАКТИРОВАТЬ: Ну, не совсем JoinStrings, о которых я думал, так что вот оно:
public static string JoinStrings<T>(this IEnumerable<T> source,
string separator)
{
StringBuilder builder = new StringBuilder();
bool first = true;
foreach (T element in source)
{
if (first)
{
first = false;
}
else
{
builder.Append(separator);
}
builder.Append(element);
}
return builder.ToString();
}
Эти дни string.Join
вместо этого имеет общую перегрузку, так что вы можете просто использовать:
return string.Join(",", list.Split(',').Select(x => $"'{x}'"));
string[] splitList = list.Split(',');
string newList = "'" + string.Join("','", splitList) + "'";
Основано на примере Джона Скита, но модернизировано для.NET 4+:
// [ "foo", "bar" ] => "\"foo\"", "\"bar\""
string.Join(", ", strList.Select(x => $"\"{x}\""));
Я думаю, что самое простое было бы Split
а потом Join
,
string nameList = "Fred,Sam,Mike,Sarah";
string[] names = nameList.Split(',');
string quotedNames = "'" + string.Join("','", names) + "'";
Я не могу написать код на C#, но этот простой код JavaScript, вероятно, легко адаптировать:
var s = "Fred,Sam,Mike,Sarah";
alert(s.replace(/\b/g, "'"));
Он просто заменяет границы (начало / конец строки, переход от слов без знаков препинания) одинарной кавычкой.
Если вы используете JSON, следующая функция поможет
var string[] keys = list.Split(',');
console.log(JSON.stringify(keys));
string list = "Fred,Sam,Mike,Sarah";
string[] splitList = list.Split(',');
for (int i = 0; i < splitList.Length; i++)
splitList[i] = String.Format("'{0}'", splitList[i]);
string newList = String.Join(",", splitList);
Мои требования:
- Разделяйте элементы запятыми.
- Оберните все элементы в списке в двойные кавычки.
- Избегайте существующих двойных кавычек в строке.
- Обрабатывать нулевые строки, чтобы избежать ошибок.
- Не беспокойтесь оборачивая нулевые строки в двойные кавычки.
Завершить с возвратом каретки и переводом строки.
string.Join (",", lCol.Select (s => s == null? null: ("\" "+ s.Replace (" \ "", "\" \ "") + "\" "))) + "\ r \ n";
Для людей, которые любят методы расширения как я, вот это:
public static string MethodA(this string[] array, string seperatedCharecter = "|")
{
return array.Any() ? string.Join(seperatedCharecter, array) : string.Empty;
}
public static string MethodB(this string[] array, string seperatedChar = "|")
{
return array.Any() ? MethodA(array.Select(x => $"'{x}'").ToArray(), seperatedChar) : string.Empty;
}
Я нашел новое решение для этой проблемы
Я связываю список значениями выбранных элементов в сетке, используя linq, после чего добавляю строку с разделителями-запятыми для каждой коллекции строк, используя свойства String.Join().
String str1 = String.Empty;
String str2 = String.Empty;
//str1 = String.Join(",", values); if you use this method,result "X,Y,Z"
str1 =String.Join("'" + "," + "'", values);
//The result of str1 is "X','Y','Z"
str2 = str1.Insert(0, "'").Insert(str1.Length+1, "'");
//The result of str2 is 'X','Y','Z'
Я надеюсь, что это будет полезно!!!!!!
Вот решение C# 6, использующее интерполяцию строк.
string newList = string.Join(",", list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => $"'{x}'")
.ToList());
Или, если вы предпочитаете вариант C# 5 с String.Format:
string newList = string.Join(",", list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => String.Format("'{0}'", x))
.ToList());
Использование StringSplitOptions удалит все пустые значения, поэтому у вас не будет пустых кавычек, если вы пытаетесь этого избежать.
Вы собираетесь обрабатывать много CSV? Если это так, вы должны также рассмотреть возможность использования библиотеки для этого. Не изобретай велосипед. К сожалению, я не нашел библиотеку столь же простую, как библиотека Python CSV, но я видел FileHelpers (бесплатный), рассмотренный в журнале MSDN Magazine, и он выглядит довольно хорошо. Вероятно, есть и другие бесплатные библиотеки. Все зависит от того, сколько обработки вы будете делать, хотя. Часто он растет и растет, пока вы не поймете, что вам лучше использовать библиотеку.
Мой "менее сложный" подход... Я полагаю, что всегда полезно использовать StringBuilder, потому что список может быть очень большим.
string list = "Fred,Sam,Mike,Sarah";
StringBuilder sb = new StringBuilder();
string[] listArray = list.Split(new char[] { ',' });
for (int i = 0; i < listArray.Length; i++)
{
sb.Append("'").Append(listArray[i]).Append("'");
if (i != (listArray.Length - 1))
sb.Append(",");
}
string newList = sb.ToString();
Console.WriteLine(newList);