Quero transformar uma matriz ou lista de ints em uma string delimitada por vírgulas, como esta:
string myFunction(List<int> a) {
return string.Join(",", a);
}
Mas string.Join leva apenas List<string>
como segundo parâmetro. Qual é a melhor maneira de fazer isso?
Respostas:
A melhor maneira é atualizar para .NET 4.0, onde há uma sobrecarga que faz o que você deseja:
String.Join<T>(String, IEnumerable<T>)
Se você não pode atualizar, você pode obter o mesmo efeito usando Select e ToArray.
return string.Join(",", a.Select(x => x.ToString()).ToArray());
fonte
ToArray
método interno deList<T>
?int
.Uma implementação escalonável e segura de uma junção de string enumerável genérica para .NET 3.5. O uso de iteradores é para que o valor da string de junção não fique preso no final da string. Funciona corretamente com 0, 1 e mais elementos:
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(); } }
Uso:
var arrayOfInts = new[] { 1, 2, 3, 4 }; Console.WriteLine(",".Join(arrayOfInts)); var listOfInts = new List<int> { 1, 2, 3, 4 }; Console.WriteLine(",".Join(listOfInts));
Aproveitar!
fonte
String.Join(String, String[])
possa ser chamado. A única coisa que eu diria é que é incomum ver esse método escrito como uma extensão emString
vez deIEnumerable<String>
- eu costumo sempre chamá-lo no final de uma longa cadeia de chamadas de método de extensão..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(); }
fonte
Esta resposta é para você se você não quiser se aventurar nas profundezas do .NET 4.0 ainda.
String.Join () concatena todos os elementos de uma matriz de string, usando o separador especificado entre cada elemento.
A sintaxe é
public static string Join( string separator, params string[] value )
Em vez de passar sua List of ints para o método Join, sugiro construir primeiro um array de strings.
Aqui está o que proponho:
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); }
fonte
intArray
é desnecessário.List<int>
é indexável e tem umaCount
propriedade, tornando a conversão para um array supérflua. Você também pode querer tornar o caractere de junção um parâmetro, em vez de codificá-lo no método.Tinha um método de extensão semelhante que modifiquei para este
public static class MyExtensions { public static string Join(this List<int> a, string splitChar) { return string.Join(splitChar, a.Select(n => n.ToString()).ToArray()); } }
e você usa assim
var test = new List<int>() { 1, 2, 3, 4, 5 }; string s = test.Join(",");
.NET 3.5
fonte
IEnumerable<T>
já tem umJoin
método, e este novo método realiza uma operação completamente diferente, tornando seu uso contra-intuitivo. Em segundo lugar, se você fosse criar esse método, vá em frente e torne-o genericamente aplicável.Usando .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); } }
fonte
Em .NET, a classe de lista tem um
.ToArray()
método. Algo assim pode funcionar:string myFunction(List<int> a) { return string.Join(",", a.ToArray()); }
Ref: Listar métodos <T> (MSDN)
fonte
answer from 2010
já afirma que, comoToString
está implícito ao fazer astring.Join
.