2010-08-26 54 views

回答

617

您可以使用String.Join。如果你有一個List<string>那麼你可以撥打ToArray第一:

List<string> names = new List<string>() { "John", "Anna", "Monica" }; 
var result = String.Join(", ", names.ToArray()); 

在.NET 4中,您不需要再ToArray,因爲是需要一個IEnumerable<string>String.Join過載。

44

你也可以做到這一點使用LINQ,如果你想

var names = new List<string>() { "John", "Anna", "Monica" }; 
var joinedNames = names.Aggregate((a, b) => a + ", " + b); 

雖然我更喜歡非LINQ語法Quartermeister的答案,我想Aggregate可能執行速度較慢(可能更字符串連接操作)。

+6

感謝您的快速回復,兩者都正常工作。你是對的我用Stopwatch類做了一個小的性能測量,而linq-way要慢得多:String.Join(「,」,names.ToArray()); - >花了18個刻度 總計((a,b)=> a +「,」+ b) - >花了736個刻度 – nan 2010-08-26 13:09:28

+1

是的,我認爲Aggregate對於數學類型的操作更好。對於字符串這個操作,它與''for each''類似,只是附加到一個效率低下的字符串,因爲您要爲列表中存在的每個項目創建一個新的字符串。 – Bob 2010-08-26 13:26:11

+0

請注意,如果容器爲空,則沒有種子值的聚合將引發InvalidOperationException。使用種子版本Aggregate(seed,func)來避免錯誤處理代碼或條件檢查。 String.Join不會拋出空,所以不需要種子或額外的代碼......再加上它不需要Linq並且語法更清晰一些。 – Huacanacha 2015-11-25 21:58:48

-2
List<string> targets = new List<string>(); 

var InboxChecked = true; 
var BannerChecked = false; 
var EmailChecked = true; 

if (InboxChecked) 
{ 
    targets.Add("Inbox"); 
} 

if (BannerChecked) 
{ 
    targets.Add("Banner"); 
} 

if (EmailChecked) 
{ 
    targets.Add("Email"); 
} 

var index = 0; 

if (targets.Any()) 
{ 
    var aggregate = targets.Aggregate((s1, s2) => 
    { 
     return ++index == targets.Count - 1 ? s1 + " and " + s2 : s1 + ", " + s2; 
    }); 

    // aggregate.Dump(); 
} 

// returns -> Inbox and Email 
+8

這是爲什麼呢?它與OP幾乎沒有任何關係......? – Assimilater 2017-06-29 19:55:04