Chcę zamienić tablicę lub listę int na ciąg rozdzielany przecinkami, na przykład:
string myFunction(List<int> a) {
return string.Join(",", a);
}
Ale string.Join przyjmuje tylko List<string>
jako drugi parametr. Jaki jest najlepszy sposób, aby to zrobić?
Odpowiedzi:
Najlepszym sposobem jest uaktualnienie do .NET 4.0, gdzie występuje przeciążenie, które robi to, co chcesz:
String.Join<T>(String, IEnumerable<T>)
Jeśli nie możesz zaktualizować, możesz osiągnąć ten sam efekt za pomocą funkcji Select i ToArray.
return string.Join(",", a.Select(x => x.ToString()).ToArray());
źródło
ToArray
metodyList<T>
?int
.Skalowalne i bezpieczne wdrożenie generycznego przeliczalnego ciąg przyłączenia dla .NET 3.5. Użycie iteratorów polega na tym, że wartość łańcucha łączenia nie utknęła na końcu łańcucha. Działa poprawnie z 0, 1 i więcej elementami:
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(); } }
Stosowanie:
var arrayOfInts = new[] { 1, 2, 3, 4 }; Console.WriteLine(",".Join(arrayOfInts)); var listOfInts = new List<int> { 1, 2, 3, 4 }; Console.WriteLine(",".Join(listOfInts));
Cieszyć się!
źródło
String.Join(String, String[])
można ją było wywołać. Powiedziałbym tylko, że to niezwykłe widzieć tę metodę jako rozszerzenie, wString
przeciwieństwie doIEnumerable<String>
- mam tendencję do wywoływania jej zawsze na końcu długiego łańcucha wywołań metod rozszerzających..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(); }
źródło
Miał podobną metodę rozszerzenia, którą zmodyfikowałem 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 używasz tego w ten sposób
var test = new List<int>() { 1, 2, 3, 4, 5 }; string s = test.Join(",");
.NET 3.5
źródło
IEnumerable<T>
już maJoin
metodę, a ta nowa metoda wykonuje zupełnie inną operację, przez co jej użycie jest sprzeczne z intuicją. Po drugie, jeśli były zamiar stworzyć tę metodę, należy iść dalej i uczynić go ogólnie dotyczy.Ta odpowiedź jest dla Ciebie, jeśli nie chcesz jeszcze zapuszczać się w głąb .NET 4.0.
String.Join () łączy wszystkie elementy tablicy ciągów, używając określonego separatora między każdym elementem.
Składnia to
public static string Join( string separator, params string[] value )
Zamiast przekazywać Listę int do metody Join, proponuję najpierw zbudować tablicę ciągów.
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); }
źródło
intArray
jest to konieczne.List<int>
jest indeksowalny i maCount
właściwość, przez co konwersja do tablicy jest zbędna. Możesz również chcieć, aby łączący znak był parametrem, zamiast zakodować go na stałe w metodzie.Korzystanie z .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); } }
źródło
W .NET klasa listy ma
.ToArray()
metodę. Coś takiego mogłoby zadziałać:string myFunction(List<int> a) { return string.Join(",", a.ToArray()); }
Ref: List <T> Methods (MSDN)
źródło
answer from 2010
już stwierdza, że, jakToString
sugeruje się podczas wykonywania plikustring.Join
.