web-dev-qa-db-fra.com

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

Cela a probablement une réponse simple, mais je ne devais pas avoir assez de café pour le comprendre 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, ajouter des guillemets et le coller dans une chaîne comme celle-ci:

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

J'imagine que commencer par chacune d'elles serait un début, mais je suis resté perplexe par la suite.

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++;
}
49
Bob Wintemberg
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 que les guillemets supplémentaires soient autour ou non? Et si l’entrée était un groupe d’espaces blancs ...? 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 fondamentale.

Mise à jour : Une alternative basée sur LINQ a également été suggérée (avec l'avantage supplémentaire d'utiliser String.Format et donc de ne pas avoir à se soucier des guillemets)

string list = "Fred,Sam,Mike,Sarah";
string newList = string.Join(",", list.Split(',').Select(x => string.Format("'{0}'", x)).ToList());
76
FOR
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);

Vous pouvez également utiliser LINQ, en particulier avec une version de String.Join 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 coup d'oeil.

EDIT: Eh bien, il n’ya pas tout à fait les JoinStrings auxquelles 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();
}

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

return string.Join(",", list.Split(',').Select(x => $"'{x}'"));
22
Jon Skeet

Suivant l'exemple de Jon Skeet ci-dessus, voici ce qui a fonctionné pour moi. J'avais déjà une variable List<String> appelée __messages alors voici ce que j'ai fait:

string sep = String.Join(", ", __messages.Select(x => "'" + x + "'"));
17
vcuankit
string[] splitList = list.Split(',');
string newList = "'" + string.Join("','", splitList) + "'";
16
Tor Haugen

Je pense que la chose la plus simple serait de Split puis Join .

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

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 ne fait que remplacer les bornes (début/fin de chaîne, transition de la ponctuation des caractères Word) par des guillemets simples.

2
PhiLho

Mes exigences:

  1. Séparez les éléments en utilisant des virgules.
  2. Enveloppez tous les éléments de la liste entre guillemets.
  3. Échappe aux guillemets existants dans la chaîne.
  4. Manipulez les chaînes vides pour éviter les erreurs.
  5. Ne vous embêtez pas en entourant les chaînes vides entre guillemets.
  6. Terminer avec retour chariot et saut de ligne.

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

1
MikeTeeVee
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
RickL

Si vous utilisez JSON, la fonction suivante vous aidera

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

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

Je lie une liste en sélectionnant des valeurs d'éléments de la grille à l'aide de linq, après l'ajout d'une chaîne séparée par des virgules pour chaque collection de chaînes à l'aide des propriétés 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'

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

0
Thivan Mydeen

Voici une solution C # 6 utilisant l’interpolation de chaînes. 

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 de StringSplitOptions supprimera toutes les valeurs vides afin d'éviter toute citation vide, si vous essayez d'éviter cela.

0
KenB

Allez-vous traiter beaucoup de CSV? Si c'est le cas, vous devriez également envisager d'utiliser une bibliothèque pour le faire. Ne réinventez pas la roue. Malheureusement, je n'ai pas trouvé de bibliothèque aussi simple que la bibliothèque CSV de Python, mais j'ai déjà vu FileHelpers (gratuit) publié sur MSDN Magazine et ça a l'air bien. Il existe probablement aussi d'autres bibliothèques gratuites. Tout dépend du nombre de traitements que vous ferez. Souvent, il grandit et grandit jusqu'à ce que vous réalisiez que vous feriez mieux d'utiliser une bibliothèque.

0
Ryan

Pour les personnes qui aiment les méthodes d'extension comme moi, la 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
Dheeraj Palagiri

L'implémentation C # de la solution d'expression régulière JavaScript de @ PhiLho est très similaire à celle-ci:

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

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

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

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
bruno conde