2010-08-31 17 views
59

chcę włączyć tablicę lub listę int na ciąg rozdzielany przecinkami, na przykład:string.join na liście <int> lub innego rodzaju

string myFunction(List<int> a) { 
    return string.Join(",", a); 
} 

Ale string.join zajmuje tylko List<string> jako drugi parametr . Jaki jest najlepszy sposób na zrobienie tego?

+2

Jaka wersja C#/.NET używasz? –

+0

Używam .NET 3.5 –

+0

Możliwy duplikat http://stackoverflow.com/questions/3211422/linq-convert-a-listint-to-a-joined-string-of-ints – goodeye

Odpowiedz

108

Najlepszym sposobem jest uaktualnienie do .NET 4.0, gdzie występuje przeciążenie, że robi to, co chcesz:

Jeśli nie można uaktualnić, można osiągnąć to samo efekt przy użyciu Select i ToArray.

return string.Join(",", a.Select(x => x.ToString()).ToArray()); 
+0

Zakłada również, że jest co najmniej na C# 3, .NET 3.5 –

+0

to jedno miłe rozwiązanie! – Stefanvds

+0

Dlaczego używać LINQ zamiast wbudowanej metody 'ToArray' z' Listy '? –

2

Ta odpowiedź jest dla Ciebie, jeśli jeszcze nie chcesz zapuszczać się w głąb .NET 4.0.

String.Join() łączy wszystkie elementy tablicy łańcuchów, używając określonego separatora między każdym elementem.

Składnia jest

public static string Join(
    string separator, 
    params string[] value 
) 

Zamiast przechodzącą listy wskazówki do metody join, proponuję budowania tablicę ciągów pierwszy.

Oto co proponuję:

static string myFunction(List<int> a) { 
    int[] intArray = a.ToArray(); 
    string[] stringArray = new string[intArray.Length]; 

    for (int i = 0; i < intArray.Length; i++) 
    { 
     stringArray[i] = intArray[i].ToString(); 
    } 

    return string.Join(",", stringArray); 
} 
+3

To przyzwoite podejście, jeśli ktoś nadal jest w wersji 2.0. Jednak 'intArray' jest niepotrzebny. 'List ' jest indeksowalna i ma właściwość 'Count', czyniąc konwersję na tablicę zbędną. Możesz również chcieć, aby znak łączenia był parametrem, a nie na stałe wpisywać go w metodę. –

2

Gdyby podobną metodę rozszerzenia że zmodyfikowany do tego

public static class MyExtensions 
{ 
    public static string Join(this List<int> a, string splitChar) 
    { 
     return string.Join(splitChar, a.Select(n => n.ToString()).ToArray()); 
    } 
} 

i go używać tak

var test = new List<int>() { 1, 2, 3, 4, 5 }; 
string s = test.Join(","); 

.NET 3.5

+0

Nie jestem pewien, czy to lubię. 'IEnumerable ' ma już metodę 'Join', a ta nowa metoda wykonuje zupełnie inną operację, dzięki czemu jej użycie jest sprzeczne z intuicją. Po drugie, jeśli * zamierzasz * tworzyć tę metodę, zastosuj ją ogólnie. –

+0

To jest hack naśladujący metodę łączenia na tablicach w Ruby. http://ruby-doc.org/core/classes/Array.html#M002182 –

+0

Również .ToString() nie zawsze zwraca ciąg znaków w postaci litery T, więc myślę, że może to naprawdę spowodować pewne zamieszanie. –

3

. NET 2.0:

static string IntListToDelimitedString(List<int> intList, char Delimiter) 
{ 
    StringBuilder builder = new StringBuilder(); 

    for (int i = 0; i < intList.Count; i++) 
    { 
     builder.Append(intList[i].ToString()); 

     if (i != intList.Count - 1) 
      builder.Append(Delimiter); 
    } 

    return builder.ToString(); 
} 
+2

Dobre podejście 2.0. Możliwe, że chcesz, aby znak łączenia był parametrem, a nie wpisywaniem go w metodę. –

+0

@Anthony - Dobra uwaga. Gotowe. –

+0

Typową optymalizacją jest dołączenie ogranicznika bez testowania, a następnie usunięcie ostatniego znaku po wyjściu z pętli. –

5

skalowalne i bezpieczny wdrożenie generycznego przeliczalnego ciąg przyłączenia dla .NET 3.5. Użycie iteratorów polega na tym, że wartość ciągu sprzężenia nie utknęła na końcu łańcucha. To działa prawidłowo z 0, 1 i więcej elementów:

public static class StringExtensions 
{ 
    public static string Join<T>(this string joinWith, IEnumerable<T> list) 
    { 
     if (list == null) 
      throw new ArgumentNullException("list"); 
     if (joinWith == null) 
      throw new ArgumentNullException("joinWith"); 

     var stringBuilder = new StringBuilder(); 
     var enumerator = list.GetEnumerator(); 

     if (!enumerator.MoveNext()) 
      return string.Empty; 

     while (true) 
     { 
      stringBuilder.Append(enumerator.Current); 
      if (!enumerator.MoveNext()) 
       break; 

      stringBuilder.Append(joinWith); 
     } 

     return stringBuilder.ToString(); 
    } 
} 

Zastosowanie:

var arrayOfInts = new[] { 1, 2, 3, 4 }; 
Console.WriteLine(",".Join(arrayOfInts)); 

var listOfInts = new List<int> { 1, 2, 3, 4 }; 
Console.WriteLine(",".Join(listOfInts)); 

Enjoy!

+0

+1: To jest mój preferowany sposób pre .NET 4.0. O wiele bardziej skalowalne niż tworzenie zupełnie nowej tablicy łańcuchów z listy int, dzięki czemu można wywołać 'String.Join (String, String [])'. Jedyne, co powiedziałbym, to to, że nietypowa jest ta metoda zapisana jako rozszerzenie na 'String' w przeciwieństwie do' IEnumerable '- zwykle nazywam to na końcu długich wywołań metod rozszerzenia. –

+1

Ukradłem pomysł z Pythona, jeśli to jest jakaś pomoc! – Deleted

1

Korzystanie NET 4,0

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     string s = myFunction(PopulateTestList()); 
     this.TextBox1.Text = s; 
    } 

    protected List<int> PopulateTestList() 
    { 
     List<int> thisList = new List<int>(); 
     thisList.Add(22); 
     thisList.Add(33); 
     thisList.Add(44); 

     return thisList; 
    } 

    protected string myFunction(List<int> a) 
    { 
     return string.Join(",", a); 
    } 
} 
1

W .NET klasa lista ma metodę .ToArray().Coś takiego może działać:

string myFunction(List<int> a) 
{ 
    return string.Join(",", a.ToArray()); 
} 

Ref: List<T> Methods (MSDN)

+0

Ta ['odpowiedź od 2010'] (http://stackoverflow.com/a/3610905/1733163) już stwierdza, że, jak' ToString' jest domniemany podczas wykonywania 'string.Join'. – Miller

Powiązane problemy