En C#: ajoutez des guillemets autour d'une chaîne dans une liste de chaînes délimitée par des virgules

Cela a probablement une réponse simple, mais je ne dois pas avoir eu assez de café pour le comprendre par moi-même:

Si j'avais une chaîne délimitée par des virgules telle que:

string list = "Fred,Sam,Mike,Sarah";

Comment obtenir chaque élément et ajouter des guillemets autour et le coller dans une chaîne comme ceci:

string newList = "'Fred','Sam','Mike','Sarah'";

Je suppose que l'itération sur chacun d'eux serait un début, mais j'ai été perplexe après cela.

Une solution qui est laide:

int number = 0;
string newList = "";
foreach (string item in list.Split(new char[] {','}))
{
    if (number > 0)
    {
        newList = newList + "," + "'" + item + "'";
    }
    else
    {
        newList = "'" + item + "'";
    }
    number++;
}
47
demandé sur Bob Wintemberg 2008-10-31 18:56:38

15 réponses

string s = "A,B,C";
string replaced = "'"+s.Replace(",", "','")+"'";

Merci pour les commentaires, j'avais manqué les citations externes.

Bien sûr.. si la source était une chaîne vide, voudriez-vous les guillemets supplémentaires autour d'elle ou non ? Et si l'entrée avait un tas d'espaces... ? Je veux dire, pour donner une solution complète à 100%, je demanderais probablement une liste de tests unitaires, mais j'espère que mon instinct a répondu à votre question principale.

Update : une alternative basée sur LINQ a également été suggérée (avec l'avantage supplémentaire d'utiliser Chaîne.Format et donc ne pas avoir à se soucier des guillemets de début/fin):

string list = "Fred,Sam,Mike,Sarah";
string newList = string.Join(",", list.Split(',').Select(x => string.Format("'{0}'", x)).ToList());
73
répondu FOR 2015-10-30 13:52:57
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);

Ou vous pouvez utiliser LINQ, en particulier avec une version de String.Rejoindre qui prend en charge IEnumerable<string>...

return list.Split(',').Select(x => "'" + x + "'").JoinStrings(",");

Il y a une implémentation de JoinStrings ailleurs sur SO... Je vais jeter un oeil pour elle.

EDIT: Eh bien, il n'y a pas tout à fait les JoinStrings auxquels je pensais, alors voici:

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

Ces jours-ci string.Join a une surcharge générique à la place, donc vous pouvez simplement utiliser:

return string.Join(",", list.Split(',').Select(x => $"'{x}'"));
21
répondu Jon Skeet 2016-05-13 05:59:11
string[] splitList = list.Split(',');
string newList = "'" + string.Join("','", splitList) + "'";
16
répondu Tor Haugen 2008-10-31 16:01:04

Suivant L'exemple de Jon Skeet ci-dessus, c'est ce qui a fonctionné pour moi. J'avais déjà une variable List<String> appelée _ _ messages, c'est donc ce que j'ai fait:

string sep = String.Join(", ", __messages.Select(x => "'" + x + "'"));
16
répondu vcuankit 2012-03-14 15:57:33

Je pense que le plus simple serait de Split et puis Join.

string nameList = "Fred,Sam,Mike,Sarah";
string[] names = nameList.Split(',');
string quotedNames = "'" + string.Join("','", names) + "'";
4
répondu Jacob Carpenter 2008-10-31 16:02:34

Je ne peux pas écrire de code C#, mais ce code JavaScript simple est probablement facile à adapter:

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

Il suffit de remplacer les limites (début / fin de la chaîne, transition des caractères de mots non ponctuation) par un guillemet simple.

2
répondu PhiLho 2008-10-31 16:01:47
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);
1
répondu RickL 2008-10-31 16:03:17

Si vous utilisez JSON, la fonction suivante aiderait

var string[] keys = list.Split(',');
console.log(JSON.stringify(keys));
1
répondu Atish Narlawar 2013-04-17 02:14:46

Mes Exigences:

  1. séparez les éléments en utilisant des virgules.
  2. enveloppe tous les éléments de la liste entre guillemets.
  3. échappe aux guillemets doubles existants dans la chaîne.
  4. gère les chaînes null pour éviter les erreurs.
  5. Ne vous embêtez pas à envelopper des chaînes nulles entre guillemets doubles.
  6. Terminez avec le retour chariot et le saut de ligne.

    Chaîne.Join ( " ,", lCol.Sélectionnez (S => S == null ? null : ("\"" + s.Remplacer("\"", "\"\"") + "\""))) + "\r\n";

1
répondu MikeTeeVee 2015-02-18 15:46:27

L'implémentation C# de la solution D'expression régulière JavaScript de @ PhiLho ressemble à quelque chose comme ceci:

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

string list = "Fred,Sam,Mike,Sarah";
string newList = regex.Replace(list,"'");
0
répondu bdukes 2017-05-23 11:54:31

Mon approche "moins sophistiquée"... Je suppose que c'est toujours une bonne pratique d'utiliser un StringBuilder car la liste peut être très grande.

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);
0
répondu bruno conde 2008-10-31 16:44:19

Allez-vous traiter beaucoup de CSV? Si oui, vous devriez également envisager d'utiliser une bibliothèque pour ce faire. Ne pas réinventer la roue. Malheureusement, je n'ai pas trouvé une bibliothèque aussi simple que la bibliothèque CSV de Python, mais j'ai vu FileHelpers (free) examiné dans le magazine MSDN et ça a l'air plutôt bien. Il y a probablement d'autres bibliothèques gratuites là-bas aussi. Tout dépend de la quantité de traitement que vous ferez cependant. Souvent il grandit et grandit jusqu'à ce que vous vous réalisiez serait préférable d'utiliser une bibliothèque.

0
répondu Ryan 2008-10-31 18:56:39

Voici une solution C# 6 utilisant L'Interpolation de chaîne.

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

Ou, si vous préférez L'option C# 5 Avec String.Format:

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

L'utilisation des StringSplitOptions supprimera toutes les valeurs vides afin que vous n'ayez pas de guillemets vides, si c'est quelque chose que vous essayez d'éviter.

0
répondu KenB 2015-12-15 16:34:56

J'ai trouvé une nouvelle solution à ce problème

Je lie une liste par des valeurs d'éléments sélectionnés de la grille en utilisant linq, après quoi j'ai ajouté une chaîne délimitée par des virgules pour chaque collection de chaînes en utilisant String.Propriétés 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'

J'espère que cela sera utile !!!!!!

0
répondu Thivan Mydeen 2016-06-15 07:20:48

Pour les gens qui aiment les méthodes d'extension comme moi, voici:

    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;
    }
0
répondu Dheeraj Palagiri 2016-09-01 14:42:12