Подтвердить что ты не робот

В С#: Добавить цитаты вокруг строки в списке строк с разделителями-запятыми

У этого, вероятно, есть простой ответ, но у меня не должно было хватить кофе, чтобы понять это самостоятельно:

Если у меня была строка с разделителями-запятыми, например:

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++;
}
4b9b3361

Ответ 1

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());

Ответ 2

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(",");

Есть реализация JoinStrings в другом месте SO... Я буду искать его.

РЕДАКТИРОВАТЬ: Ну, не так, как я думал об объединенных строках, так вот вот:

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}'"));

Ответ 3

string[] splitList = list.Split(',');
string newList = "'" + string.Join("','", splitList) + "'";

Ответ 4

Следуя примеру Йона Скита, это то, что сработало для меня. У меня уже была переменная List<String>, называемая __messages, вот что я сделал:

string sep = String.Join(", ", __messages.Select(x => "'" + x + "'"));

Ответ 5

Я думаю, что самая простая вещь была бы Split, а затем Join.

string nameList = "Fred,Sam,Mike,Sarah";
string[] names = nameList.Split(',');
string quotedNames = "'" + string.Join("','", names) + "'";

Ответ 6

Я не могу написать код С#, но этот простой код JavaScript, вероятно, легко адаптируется:

var s = "Fred,Sam,Mike,Sarah";
alert(s.replace(/\b/g, "'"));

Он просто заменяет границы (начало/конец строки, переход от символов слова без пунктуации) по одной кавычки.

Ответ 7

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);

Ответ 8

Если вы используете JSON, следующая функция поможет

var string[] keys = list.Split(',');
console.log(JSON.stringify(keys));

Ответ 9

Мои требования:

  • Разделяйте элементы запятыми.
  • Оберните все элементы в списке в двойных кавычках.
  • Исключить существующие двойные кавычки в строке.
  • Обрабатывать нулевые строки, чтобы избежать ошибок.
  • Не мешайте обматывать нулевые строки в двойных кавычках.
  • Завершить с возвратом каретки и подачей строки.

    string.Join( ",", lCol.Select(s = > s == null? null: ( "\" "+ s.Replace( "\" ", "\" \" ") +" \ "))) +" \ r\n";

Ответ 10

Реализация С# для @PhiLho Решение для регулярного выражения JavaScript выглядит примерно так:

Regex regex = new Regex(
    @"\b",
    RegexOptions.ECMAScript
    | RegexOptions.Compiled
    );

string list = "Fred,Sam,Mike,Sarah";
string newList = regex.Replace(list,"'");

Ответ 11

Мой "менее сложный" подход... Я полагаю, что всегда рекомендуется использовать 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);

Ответ 12

Собираетесь ли вы обрабатывать много CSV? Если это так, вы должны также рассмотреть возможность использования библиотеки для этого. Не изобретайте велосипед. К сожалению, я не нашел библиотеку так же просто, как и библиотеку Python CSV, но я видел FileHelpers (бесплатно) рассмотрен в журнале MSDN, и это выглядит довольно хорошо. Есть, вероятно, и другие бесплатные библиотеки. Все зависит от того, сколько обработки вы будете делать. Часто он растет и растет, пока вы не поймете, что вам лучше использовать библиотеку.

Ответ 13

Вот решение С# 6 с использованием String Interpolation.

string newList = string.Join(",", list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                       .Select(x => $"'{x}'")
                       .ToList());

Или, если вы предпочитаете вариант С# 5 с помощью String.Format:

string newList = string.Join(",", list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                       .Select(x => String.Format("'{0}'", x))
                       .ToList());

Использование StringSplitOptions приведет к удалению любых пустых значений, поэтому у вас не будет пустых кавычек, если это то, чего вы пытаетесь избежать.

Ответ 14

Я нашел новое решение для этой проблемы

Я привязываю список по выбранным значениям элементов из сетки с помощью 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'

Надеюсь, это поможет!!!!!!

Ответ 15

Для людей, которые любят методы расширения, такие как я, вот он:

    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;
    }