2011-06-22 75 views
0

我有Ienumarbale集合,我想用分隔符將其合併到一個字符串中;如何使用Linq Aggergate函數將IEnumerable <string>聚合爲字符串

例如{「One」,「Two」,「Three」} - >「One; Two; Three;」

是否可以使用以下功能?

List<string> list = new List<string>(){"One","Two","Three"}; 
list.Aggregate<String>((x,y) => x + String.Format("{0};",y)); 

我自己也嘗試這樣的代碼:

list.Aggregate<String>((x,y) => String.Format("{0};{1}",x,y)); 

兩個樣本沒有工作。

有什麼建議嗎? 謝謝, Itay

編輯:我看到它是不可能做我想用Linq-2-sql或Linq-2-sql中的聚合函數。

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/dac496c0-5b37-43ba-a499-bb8eff178706/

EDIT2:我使用的解決辦法是去了由原始的LINQ查詢reutrned項目......並將其複製到一個新的列表,而在下面在LINQ的答案建議加入對象而不是linq-2-sql對象。

感謝您的幫助。

回答

4

您可以爲此使用String.Join。如果你使用.NET4那麼你可以直接使用the overload that takes an IEnumerable<string>

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

如果您在使用框架的舊版本,那麼你就需要使用the overload that takes a string[] array相反,第一您的收藏轉換爲數組,如果必要:

string joined = string.Join(";", list.ToArray()); 

編輯...

當然,如果你真的想用Aggregate出於某種原因則沒有什麼能阻止你。如果是這樣,它通常建議使用StringBuilder,而不是多個字符串分配到建立自己的字符串:

string joined = list.Aggregate(new StringBuilder(), 
           (sb, s) => sb.Append(s).Append(';'), 
           sb => (sb.Length > 0) ? sb.ToString(0, sb.Length - 1) 
                : ""); 
+0

這不工作我得到以下錯誤的道路: 方法作者: ystem.String加入(System.String,System.Collections.Generic.IEnumerable'1 [System.String])'不支持對SQL的轉換。 –

+0

@Itay:對不起,我完全錯過了你的LINQ-to-SQL標籤。這隻適用於LINQ到對象。 – LukeH

+0

沒關係,我已經編輯了標記到linq-to-sql,因爲我使它變得不同 –

1

你需要提供一個初始化,否則第一個元素不會有;添加到它:

list.Aggregate<String>("", (x,y) => x + String.Format("{0};",y)); 
+0

在這段代碼上,我收到以下錯誤: 「查詢運算符'Aggregate'不受支持。「 –

+0

Microsoft/Joe Albahari:在LINQ to SQL中不支持Aggregate運算符,因爲沒有辦法將任意聚合轉換爲SQL,我無法想象這會很快發生變化 –

+0

您的原始問題沒有聲明linq-到SQL。 – Femaref

1

您可以使用下面的代碼做

 
list.Aggregate((i, j) => i + ";" + j); 
相關問題