2008-10-03 61 views
14

IEnumerable<string>轉換爲分隔字符串的函數式編程方法是什麼?我知道我可以使用一個循環,但我試圖圍繞函數式編程來包裝我的頭。C# - IEnumerable以分隔字符串

這裏是我的例子:

var selectedValues = 
from ListItem item in checkboxList.Items 
where item.Selected 
select item.Value; 

var delimitedString = ?? 

..或者我能做到這一點在剛剛第一VAR分配(附加每個結果到以前的)?

回答

17
var delimitedString = selectedValues.Aggregate((x,y) => x + ", " + y); 
31
string.Join(", ", string[] enumerable) 
+2

+1,但我要說的string.join( 「」 selectedValues.ToArray()) – Lucas 2008-10-04 16:55:14

+2

@Lucas,不,如果你正在使用.NET 4. http://msdn.microsoft.com/en-us/library/dd992421.aspx – 2010-09-09 16:29:22

+0

@Omer,true!但這是在2008年10月,.NET 4之前:) – Lucas 2010-09-09 17:43:03

4
var delimitedString = string.Join(",", checkboxList.Items.Where(i => i.Selected).Select(i => i.Value).ToArray()); 
2

那麼,在這種情況下,功能性的做法可能不是最適合的,僅僅是因爲沒有一個LINQ「的ForEach」,而你不想使用字符串連接:要使用StringBuilder。你可以使用ToArray的(一個例子以上纔出現),但我會忍不住簡單地使用:

StringBuilder sb = new StringBuilder(); 
    foreach(ListViewItem item in checkboxList.SelectedItems) { 
     if(sb.Length > 0) sb.Append(','); 
     sb.Append(item.Text); 
    } 
    string s = sb.ToString(); 

不函數式編程,但它的工作原理......當然,如果你的來源是已經一string []然後string.Join是完美的。 (LINQ是一個偉大的工具,但不一定總是對每個職位的最佳工具)

1

下面是做這件事的LINQ /功能性的方式。


string[] toDelimit = CallSomeFunction(); 
return toDelimit.Aggregate((x, y) => x + "," + y); 
3

AviewAnew是最好的答案,但如果你正在尋找的是學習如何在功能想什麼,你應該做的是使用摺疊操作(或聚集這就是所謂的NET)。

items.Aggregate((accum, elem) => accum + ", " + elem); 
23

下面是一個StringBuilder的示例。好的是Append()返回StringBuilder實例本身。

return list.Aggregate(new StringBuilder(), 
           (sb, s) => 
           (sb.Length == 0 ? sb : sb.Append(',')).Append(s)); 
0

這是3.5兼容:

var selectedValues = String.Join(",", (from ListItem item in checkboxList.Items where item.Selected select item.Value).ToArray());