2010-08-31 96 views
59

我希望把int數組或列表到逗號分隔的字符串,像這樣:的string.join在列表<int>或其他類型的

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

不過的string.join只需要List<string>作爲第二個參數。做這個的最好方式是什麼?

+2

的C#什麼版本/ .NET您使用的? – 2010-08-31 15:23:58

+0

我正在使用.NET 3.5 – 2010-08-31 15:39:36

+0

可能的重複http://stackoverflow.com/questions/3211422/linq-convert-a-listint-to-a-joined-string-of-ints – goodeye 2013-11-19 01:40:42

回答

108

,最好的辦法是升級到.NET 4.0,其中有一個重載,你想要做什麼:

如果不能升級,就可以達到同樣的使用Select和ToArray的效果。

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

也假設他至少在C#3,.NET 3.5 – 2010-08-31 15:19:40

+0

這是一個很好的解決方案! – Stefanvds 2010-08-31 15:20:24

+0

爲什麼使用LINQ而不是'List '的內置'ToArray'方法? – 2010-08-31 15:27:10

2

如果你不想冒險進入.NET 4.0的深處,這個答案是適合你的。

String.Join()使用每個元素之間指定的分隔符連接字符串數組的所有元素。

語法

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

而不是通過你的整數的列表中加入的方法,我建議首先建立一個字符串數組。

這裏是我的建議:

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

如果有人還在2.0上,這是一個體面的方法。但是,'intArray'是不必要的。 '列表'是可索引的並且具有'Count'屬性,使得對數組的轉換變得多餘。您也可能希望將連接字符作爲參數,而不是將其硬編碼到該方法中。 – 2010-08-31 15:45:09

2

要是我修改這個

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

類似的擴展方法,你像這樣使用

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

.NET 3.5

+0

不知道我喜歡這個。 'IEnumerable '已經有一個'Join'方法,並且這個新方法執行完全不同的操作,使得它的使用不直觀。其次,如果你*要創建這種方法,請繼續並使其一般適用。 – 2010-08-31 15:41:07

+0

這是一個模仿Ruby中數組連接方法的黑客攻擊。 http://ruby-doc.org/core/classes/Array.html#M002182 – 2010-08-31 15:58:40

+0

另外.ToString()並不總是返回T的字符串表示,所以我想這可能會造成一些混淆。 – 2010-08-31 16:00:07

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

一個很好的2.0方法。您可能希望將連接字符作爲參數,而不是將其硬編碼到該方法中。 – 2010-08-31 15:48:20

+0

@Anthony - 好點。完成。 – 2010-08-31 15:50:31

+0

典型的優化是在不進行測試的情況下附加分隔符,然後在退出循環後刪除最後一個字符。 – 2010-08-31 16:15:04

5

一個可擴展安全實現一個通用的枚舉字符串的加入對.NET 3.5。迭代器的用法是,連接字符串值不會卡在字符串的末尾。它的工作原理正確地0,1和多個元素:

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

用法:

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

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

享受!

+0

+1:這是我在.NET 4.0之前的首選方式。比從int列表生成全新字符串數組更可伸縮,以便可以調用String.Join(String,String [])'。唯一我要說的是,在'String'上看到這個方法是一個擴展,而不是'IEnumerable '' - 我傾向於在一個長鏈延伸方法調用的結尾調用它。 – 2010-08-31 16:32:17

+1

我從Python偷取了這個想法,如果有任何幫助的話! – Deleted 2010-08-31 19:47:37

1

使用.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

在.NET中的列表類有一個.ToArray()方法。像這樣的東西可以工作:

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

編號:List<T> Methods(MSDN)

+0

這個['來自2010'的答案](http://stackoverflow.com/a/3610905/1733163)已經聲明,做'string.Join'時隱含'ToString'。 – Miller 2014-03-31 23:31:09

相關問題