2013-01-02 194 views
14

我想在C#中用逗號分隔的列表創建一個單詞「and」作爲最後的分隔符。逗號分隔的列表,用「和」代替最後的逗號

string.Join(", ", someStringArray) 

會導致這樣的

Apple, Banana, Pear 

一個字符串,而是我希望它看起來像這樣:

Apple, Banana and Pear 

有沒有一種簡單的方法使用LINQ和實現它沒有使用循環?

+0

這些項目是否必須以現在的順序出現,還是我們可以重新安排? –

+0

它們應該是相同的順序。 – bytecode77

+4

'並且不使用循環' - 正如答案所證明的那樣,您不需要顯式循環。但是,循環並不是什麼壞事,而LINQ真的只是爲你生成循環。 –

回答

22

你可以做除了最後一個所有項目加入,然後手動添加的最後一個項目:

using System; 
using System.Linq; 

namespace Stackoverflow 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DumpResult(new string[] { }); 
      DumpResult(new string[] { "Apple" }); 
      DumpResult(new string[] { "Apple", "Banana" }); 
      DumpResult(new string[] { "Apple", "Banana", "Pear" }); 
     } 

     private static void DumpResult(string[] someStringArray) 
     { 
      string result = string.Join(", ", someStringArray.Take(someStringArray.Length - 1)) + (someStringArray.Length <= 1 ? "" : " and ") + someStringArray.LastOrDefault(); 
      Console.WriteLine(result); 
     } 
    } 
} 

正如你所看到的,對項目的金額的支票,並決定是否有必要添加'和'部分。

+1

不錯,但是如果列表包含少於兩個項目呢? –

+1

然後,我們需要使用這個:string days = string.Join(「,」,notSentDays.Take(notSentDays.Count - 1))+(notSentDays.Count == 1?「」「and」)+ notSentDays 。持續(); – bytecode77

+0

我寧願使用比'IEnumerable '過載'字符串,字符串[],int,int'超載。 – Rawling

11

一個可能的解決方案:

var items = someStringArray; // someStringArray.ToList() if not a ICollection<> 
var s = string.Join(", ", items.Take(items.Count() - 1)) + 
     (items.Count() > 1 ? " and " : "") + items.LastOrDefault(); 

注意,這個說法可以遍歷someStringArray多次,如果它沒有實現ICollection<string>(列表和數組實現它)。如果是這樣,請在您的收藏中創建一個列表並對其執行查詢。

+0

與0,1和2+條目完美匹配。太好了! –

+1

@JonB:你的意思是「與0個條目完美配合」。應該發生什麼? –

+0

@MarkByers - 它返回「」,而不是引發異常或返回類似「,」或「和」的東西。 –

2

有沒有簡單的方法來實現它與Linq和不使用循環?

不可能沒有循環。 For循環會最好。 LINQ查詢將使用多個循環。

string Combine (IEnumerable<string> list) 
    { 
     bool start = true; 
     var last = string.Empty; 
     String str = string.Empty; 

     foreach(var item in list) 
     { 
      if (!start) 
      { 
       str = str + " , " + item; 
       last = item; 

      } 
      else 
      { 
       str = item; 
       start = false; 
      } 

     } 

     if (!string.IsNullOrWhiteSpace(last)) 
     { 
      str = str.Replace(" , " + last, " and " + last); 
     } 

     return str; 
    } 
+0

非常容易閱讀和理解。 – SoftwareCarpenter

+0

好吧,如果列表足夠長,多個循環可能會出現性能問題。由於大約有5個條目,所以性能並不重要。我使用Linq的原因是爲了避免意大利麪代碼。這個項目大約有10個人在工作,所以我們不能像這樣交換性能來進行可讀性。但謝謝你的回答。 – bytecode77

+2

@Devils,如果有多個條目使用'StringBuilder'而不是'String'。否則,這是比任何其他LINQ查詢最有效的解決方案。我總是試圖在LINQ中做所有事情(因爲它是可讀的),但是當性能問題出現時,使用LINQ編寫最糟糕的代碼很容易> – Tilak