用逗号分隔列表,用"和"代替最后一个逗号

byt*_*e77 17 c# linq string list

我想在C#中创建一个以逗号分隔的列表,其中单词"and"作为最后一个分隔符.

string.Join(", ", someStringArray)
Run Code Online (Sandbox Code Playgroud)

会产生这样的字符串

Apple, Banana, Pear
Run Code Online (Sandbox Code Playgroud)

但我希望它看起来像这样:

Apple, Banana and Pear
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以使用Linq实现它而不使用循环?

Wou*_*ort 25

您可以对除最后一项之外的所有项目进行加入,然后手动添加最后一项:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,检查项目数量并确定是否需要添加"和"部分.

  • 然后,我们需要使用这个: string days = string.Join(", ", notSentDays.Take(notSentDays.Count - 1)) + (notSentDays.Count == 1 ? "" : " and ") + notSentDays。最后的(); (2认同)

dig*_*All 13

一种可能的方案:

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

请注意,如果该语句someStringArray未实现ICollection<string>(列表和数组实现它),则该语句可以多次迭代.如果是这样,请使用您的集合创建一个列表并对其执行查询.