Список, разделенный запятыми, с "и" вместо последней запятой - программирование

Список, разделенный запятыми, с "и" вместо последней запятой

Я хочу создать список с запятыми в С# со словом "и" в качестве последнего разделителя.

string.Join(", ", someStringArray)

приведет к строке, подобной этой

Apple, Banana, Pear

но вместо этого хочу, чтобы он выглядел следующим образом:

Apple, Banana and Pear

Есть ли простой способ добиться этого с помощью Linq и без с помощью циклов?

4b9b3361

Ответ 1

Вы можете выполнить объединение всех элементов, кроме последнего, а затем вручную добавить последний элемент:

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

Как вы можете видеть, есть проверка количества элементов и решает, нужно ли добавлять "и" часть.

Ответ 2

Одно из возможных решений:

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> (списки и массивы реализуют его). Если это так, создайте список с вашей коллекцией и выполните запрос.

Ответ 3

Есть ли простой способ добиться этого с помощью Linq и без использования циклов?

Невозможно без цикла. Для цикла будет работать лучше всего. Запросы 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;
    }