Список, разделенный запятыми, с "и" вместо последней запятой
Я хочу создать список с запятыми в С# со словом "и" в качестве последнего разделителя.
string.Join(", ", someStringArray)
приведет к строке, подобной этой
Apple, Banana, Pear
но вместо этого хочу, чтобы он выглядел следующим образом:
Apple, Banana and Pear
Есть ли простой способ добиться этого с помощью Linq и без с помощью циклов?
Ответы
Ответ 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;
}