我想在C#中用逗號分隔的列表創建一個單詞「and」作爲最後的分隔符。逗號分隔的列表,用「和」代替最後的逗號
string.Join(", ", someStringArray)
會導致這樣的
Apple, Banana, Pear
一個字符串,而是我希望它看起來像這樣:
Apple, Banana and Pear
有沒有一種簡單的方法使用LINQ和實現它沒有使用循環?
我想在C#中用逗號分隔的列表創建一個單詞「and」作爲最後的分隔符。逗號分隔的列表,用「和」代替最後的逗號
string.Join(", ", someStringArray)
會導致這樣的
Apple, Banana, Pear
一個字符串,而是我希望它看起來像這樣:
Apple, Banana and Pear
有沒有一種簡單的方法使用LINQ和實現它沒有使用循環?
你可以做除了最後一個所有項目加入,然後手動添加的最後一個項目:
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);
}
}
}
正如你所看到的,對項目的金額的支票,並決定是否有必要添加'和'部分。
不錯,但是如果列表包含少於兩個項目呢? –
然後,我們需要使用這個:string days = string.Join(「,」,notSentDays.Take(notSentDays.Count - 1))+(notSentDays.Count == 1?「」「and」)+ notSentDays 。持續(); – bytecode77
我寧願使用比'IEnumerable
一個可能的解決方案:
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,1和2+條目完美匹配。太好了! –
@JonB:你的意思是「與0個條目完美配合」。應該發生什麼? –
@MarkByers - 它返回「」,而不是引發異常或返回類似「,」或「和」的東西。 –
有沒有簡單的方法來實現它與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;
}
非常容易閱讀和理解。 – SoftwareCarpenter
好吧,如果列表足夠長,多個循環可能會出現性能問題。由於大約有5個條目,所以性能並不重要。我使用Linq的原因是爲了避免意大利麪代碼。這個項目大約有10個人在工作,所以我們不能像這樣交換性能來進行可讀性。但謝謝你的回答。 – bytecode77
@Devils,如果有多個條目使用'StringBuilder'而不是'String'。否則,這是比任何其他LINQ查詢最有效的解決方案。我總是試圖在LINQ中做所有事情(因爲它是可讀的),但是當性能問題出現時,使用LINQ編寫最糟糕的代碼很容易> – Tilak
這些項目是否必須以現在的順序出現,還是我們可以重新安排? –
它們應該是相同的順序。 – bytecode77
'並且不使用循環' - 正如答案所證明的那樣,您不需要顯式循環。但是,循環並不是什麼壞事,而LINQ真的只是爲你生成循環。 –