20

我想在 C# 中创建一个逗号分隔的列表,并将“and”作为最后一个分隔符。

string.Join(", ", someStringArray)

会产生这样的字符串

Apple, Banana, Pear

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

Apple, Banana and Pear

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

4

3 回答 3

30

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

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);
        }
    }
}

如您所见,检查项目的数量并决定是否需要添加“和”部分。

于 2013-01-02T14:03:28.363 回答
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();

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

于 2013-01-02T14:07:17.480 回答
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;
    }
于 2013-01-02T16:47:27.530 回答