Konwertuj listę na ciąg w C #


184

Jak przekonwertować listę na ciąg w C #?

Kiedy wykonuję toStringna obiekcie List, otrzymuję:

System.Collections.Generic.List`1 [System.String]


1
Lista to kolekcja, jak powinien wyglądać ten ciąg?
Marko

Możesz wypróbować jeden z trzech wymienionych tutaj sposobów .
RBT

Odpowiedzi:


365

Może próbujesz to zrobić

string combindedString = string.Join( ",", myList.ToArray() );

Możesz zastąpić „,” tym, przez co chcesz podzielić elementy na liście.

Edycja : Jak wspomniano w komentarzach, możesz również zrobić

string combindedString = string.Join( ",", myList);

Odniesienie:

Join<T>(String, IEnumerable<T>) 
Concatenates the members of a collection, using the specified separator between each member.

4
masz na myśli string combindedString = string.Join (",", myList.ToArray ());
piła

2
Argument „2”: nie można przekonwertować z „System.Collections.Generic.List <string>” na „string []”
Ash

9
Użyłem tego niedawno, to działa - po prostu pomiń .ToArray ()
Adrian K

3
@AdrianK masz rację, ponieważ .Net 4.0 dodał możliwość przekazywania w dowolnym IEnumerable <ciąg>. Jednak wersja 4.0 została wydana w kwietniu 2010 r., Zanim opublikowano to pytanie i odpowiedź, więc być może ludzie tutaj nie byli jeszcze tego świadomi (z wyjątkiem kilku poniżej)
Andrew Steitz,

W przypadku vb.net Dim combindedString As String = String.Join (",", myList.ToArray ())
PartTimeNerd

55

Idę z przeczuciem i zakładam, że chcesz połączyć wynik wywołania ToStringkażdego elementu listy.

var result = string.Join(",", list.ToArray());

16

Możesz użyć string.Join:

List<string> list = new List<string>()
{
    "Red",
    "Blue",
    "Green"
};

string output = string.Join(Environment.NewLine, list.ToArray());    
Console.Write(output);

Wynik byłby:

Red    
Blue    
Green

Alternatywnie Environment.NewLinemożesz zastąpić go wybranym przez Ciebie separatorem linii opartym na łańcuchach.


14

Jeśli chcesz czegoś nieco bardziej złożonego niż proste połączenie, możesz użyć LINQ np

var result = myList.Aggregate((total, part) => total + "(" + part.ToLower() + ")");

Weźmie [„A”, „B”, „C”] i wyprodukuje „(a) (b) (c)”


1
Użyj Aggregate z ziarnem jako pierwszym parametrem, aby uniknąć zgłaszania wyjątku InvalidOperationException dla pustych kolekcji.
Huacanacha,

13

String.Join(" ", myList)lub String.Join(" ", myList.ToArray()). Pierwszy argument to separator między podciągami.

var myList = new List<String> { "foo","bar","baz"};
Console.WriteLine(String.Join("-", myList)); // prints "foo-bar-baz"

W zależności od wersji .NET może być konieczne użycie najpierw ToArray () na liście.


9

Masz List<string>- więc jeśli chcesz je połączyć, coś w tym rodzaju

string s = string.Join("", list);

działałoby (przynajmniej w .NET 4.0). Pierwszym parametrem jest separator. Możesz więc także wstawić przecinek itp.

Możesz także rozważyć użycie StringBuilder do wykonywania konkatenacji zamiast tworzenia listy.


8

.ToString()Metoda dla typów referencyjnych zwykle postanawia wrócić doSystem.Object.ToString() , jeśli nie zastępują go w rodzaju pochodzącej (ewentualnie przy użyciu metody rozszerzenie dla typów wbudowanych). Domyślnym zachowaniem dla tej metody jest wyświetlenie nazwy typu, na który jest wywoływana. Widzisz więc oczekiwane zachowanie.

Możesz spróbować czegoś takiego, string.Join(", ", myList.ToArray());aby to osiągnąć. To dodatkowy krok, ale można go zastosować w metodzie rozszerzenia, System.Collections.Generic.List<T>aby było trochę łatwiej. Coś takiego:

public static class GenericListExtensions
{
    public static string ToString<T>(this IList<T> list)
    {
        return string.Join(", ", list);
    }
}

(Zauważ, że jest to kod z wolnej ręki i nie przetestowany. W tej chwili nie mam pod ręką kompilatora. Więc będziesz chciał z nim trochę poeksperymentować).


działa, gdy nazywam go nie ToString lub wykonuję go z parametrem ogólnym. Ale podoba mi się twój pomysł użycia metody rozszerzenia :)
IAdapter


2

Jeśli szukasz kolejno pozycje w liście do wielkiego długiego łańcucha, to zrobić: String.Join("", myList). Niektóre starsze wersje frameworka nie pozwalają na przekazanie IEnumerable jako drugiego parametru, więc może być konieczne przekonwertowanie listy na tablicę poprzez wywołanie funkcji .ToArray ().


2

Bezpośrednia odpowiedź na twoje pytanie brzmi String.Join jak mówili inni.

Jeśli jednak potrzebujesz pewnych manipulacji, możesz użyć Aggregate:

List<string> employees = new List<string>();
employees.Add("e1");
employees.Add("e2");
employees.Add("e3");

string employeesString = "'" + employees.Aggregate((x, y) => x + "','" + y) + "'";
Console.WriteLine(employeesString);
Console.ReadLine();

1
w kodzie produkcyjnym upewnij się, że twoja lista ma jakiś element, w przeciwnym razie spowoduje to wyjątek.
AZ_

1

Ta metoda pomogła mi przy próbie pobrania danych z pliku tekstowego i zapisania ich w tablicy, a następnie przypisania do zmiennej łańcuchowej.

string[] lines = File.ReadAllLines(Environment.CurrentDirectory + "\\Notes.txt");  
string marRes = string.Join(Environment.NewLine, lines.ToArray());

Mam nadzieję, że może komuś pomóc !!!!


0

Wydaje mi się, że to działa.

var combindedString = new string(list.ToArray());

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.