2008-10-31 10 views
42

To prawdopodobnie ma prostej odpowiedzi, ale nie musi mieć wystarczająco dużo kawy, aby zrozumieć to na własną rękę:W języku C#: Dodaj cudzysłowie ciąg w rozdzielany przecinkami listę ciągów

Gdybym przecinek rozdzielany ciąg takich jak:

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

jak dostanie każdy element i dodać cytaty wokół niego i trzymać go z powrotem w ciągu znaków takich jak to:

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

jestem zakładając Iterowanie nad każdym z nich byłby początek , ale Zaskoczyło mnie to.

Jednym z rozwiązań, które jest brzydki:

int number = 0; 
string newList = ""; 
foreach (string item in list.Split(new char[] {','})) 
{ 
    if (number > 0) 
    { 
     newList = newList + "," + "'" + item + "'"; 
    } 
    else 
    { 
     newList = "'" + item + "'"; 
    } 
    number++; 
} 
+0

Jestem pewien, że ktoś ma regex odpowiedź na to pytanie. Sądzę, że to byłby sposób, aby to zrobić, ale nie jestem też na moim wyglądzie rano albo .. – Codewerks

+0

Nie, myślę, że FOR ma najprostsze rozwiązanie ... Pamiętaj, z wyrażeń regularnych, teraz masz dwa problemy . :) http://www.codinghorror.com/blog/archives/001016.html –

Odpowiedz

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

Dzięki za komentarze, że ominęło cytaty zewnętrznych.

Oczywiście .. jeśli źródło było pustym łańcuchem, czy chciałbyś dodać dodatkowe wyceny do niego, czy nie? A co, jeśli dane wejściowe były sporej ilości białych znaków? Chodzi mi o to, że aby dać kompletne rozwiązanie w 100%, prawdopodobnie poprosiłbym o listę testów jednostkowych, ale mam nadzieję, że mój intuicyjny instynkt odpowiedział na twoje podstawowe pytanie.

Aktualizacja: Alternatywą LINQ opartych Sugerowano także (z dodatkową korzyścią korzystania String.Format i dlatego nie martwiąc się o wiodącym/końcowe cytaty):

string list = "Fred,Sam,Mike,Sarah"; 
string newList = string.Join(",", list.Split(',').Select(x => string.Format("'{0}'", x)).ToList()); 
+0

To nieco upraszcza. Wystarczy, że dodasz cytaty na początku i końcu łańcucha, aby je ukończyć. –

+1

Należy dodać pojedyncze cudzysłowy na początku i końcu ciągu. – Maxam

+0

To dałoby "Fred", "Sam", "Mike", "Sarah"; – Codewerks

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

Podobają mi się za spryt, ale trudniej jest zrozumieć (ponieważ nie jest to tak proste) jak cytowanie każdego ciągu i łączenie z przecinkami. Mimo to Nicea :) –

+0

Podoba mi się ta odpowiedź bardziej niż wybrana. Dzięki! – CleanBold

+0

Myślę, że w ten sposób uzyskujesz, w niektórych przypadkach, pusty ciąg ("') na końcu łańcucha wyjściowego. To może nie zawsze być najlepszym rozwiązaniem dla tych przypadków. –

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

Albo można użyć LINQ, zwłaszcza z wersją string.join który obsługuje IEnumerable<string> ...

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

Istnieje implementacja JoinStrings w innym miejscu na SO ... Będę go szukać.

EDIT: No, nie ma dość JoinStrings Myślałam o, więc tutaj jest:

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

Te dni string.Join ma przeciążenia rodzajowe zamiast chociaż, więc można po prostu użyć:

return string.Join(",", list.Split(',').Select(x => $"'{x}'")); 
+0

Próbuję użyć Twojej metody i otrzymuję "deklaracja parametru typu" musi być identyfikatorem, a nie typem ". Moja klasa rozszerzeń jest zadeklarowana jako 'public static Class Extensions'. Czy to może być przyczyną? – user919426

+1

@ user919426: Nie, to było po prostu zepsute. Naprawiłem to teraz. –

+0

Przepraszamy za spóźnioną odpowiedź, ale dzięki @Jon Skeet – user919426

2

nie mogę napisać kod C#, ale ten prosty kod JavaScript jest prawdopodobnie łatwy do przystosowania:

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

Po prostu zastępuje granice (początek/koniec ciągu, przejście od wyrazów nie będących znakami interpunkcyjnymi) za pomocą pojedynczego cudzysłowu.

4

Myślę, że najprostszą rzeczą byłoby Split, a następnie Join.

string nameList = "Fred,Sam,Mike,Sarah"; 
string[] names = nameList.Split(','); 
string quotedNames = "'" + string.Join("','", names) + "'"; 
1
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); 
0

the # implementacja C @ „s PhiLho JavaScript regularnie roztworem ekspresji wygląda mniej więcej tak:

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

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

Należy pamiętać, że to rozwiązanie nie powiedzie się, ponieważ elementy mają w nich spacje. W takim przypadku rozwiązanie pętli for zaczyna wyglądać o wiele czystsze. – bdukes

0

moje podejście "mniej wyrafinowane" ... Przypuszczam, że to zawsze dobry przećwicz użycie StringBuilder, ponieważ lista może być bardzo duża.

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

Czy zamierzasz przetwarzać dużo plików CSV? Jeśli tak, powinieneś także rozważyć użycie biblioteki, aby to zrobić. Nie wymyślaj ponownie koła. Niestety, nie znalazłem biblioteki tak prostej jak biblioteka CSV Pythona, ale widziałem FileHelpers (bezpłatnie) reviewed at MSDN Magazine i wygląda całkiem nieźle. Prawdopodobnie istnieją również inne wolne biblioteki. Wszystko zależy od tego, ile przetwarzania będziesz robić. Często rośnie i rośnie, dopóki nie uświadomisz sobie, że lepiej skorzystać z biblioteki.

14

Po powyższym przykładzie Jon Skeet, to właśnie dla mnie zadziałało. Miałem już List<String> zmienną __messages więc to, co zrobiłem:

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

Jeśli używasz JSON, następująca funkcja pomoże

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

moje wymagania:

  1. odrębne pozycje używając przecinków.
  2. Zawiń wszystkie pozycje na liście w podwójnych cudzysłowach.
  3. Uciec istniejącym cudzysłowom w łańcuchu.
  4. Obsługa ciągów zerowych w celu uniknięcia błędów.
  5. Nie zawracaj sobie głowy owijaniem łańcuchów null w podwójne cudzysłowy.
  6. Kończy się z powrotem karetki i podawania linii.

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

0

Oto C# 6 rozwiązanie wykorzystujące String Interpolacja

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

Lub, jeśli wolisz opcję C# 5 sznurkiem.. Format:

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

Korzystanie z obiektu StringSplitOptions będzie r emove dowolne puste wartości, więc nie będziesz miał żadnych pustych ofert, jeśli chcesz tego uniknąć.

0

Znalazłem nowe rozwiązanie tego problemu

wiążę listę wybranych pozycji wartości z sieci przy użyciu LINQ, po czym dodał rozdzielany przecinkami ciąg dla każdej kolekcji ciąg znaków za pomocą string.join() Właściwości .

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' 

Mam nadzieję, że to pomoże !!!!!!

0

Dla ludzi, którzy kochają metody rozszerzenie jak ja, to jest tutaj:

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; 
    } 
Powiązane problemy