我想在C#中创建一个以逗号分隔的列表,并将“and”作为最后一个分隔符。
string.Join(", ", someStringArray)
会产生一个像这样的字符串
Apple, Banana, Pear
但我希望它看起来像这样:
Apple, Banana and Pear
有没有一种简单的方法可以使用Linq实现它,没有使用循环?
答案 0 :(得分:23)
您可以对除最后一项之外的所有项目进行加入,然后手动添加最后一项:
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 :(得分:12)
一种可能的解决方案:
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>
。如果是这样,请使用您的集合创建一个列表并对其执行查询。
答案 2 :(得分: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;
}