C# 以逗号分隔的列表,并带有“QUOTE”;及;代替最后一个逗号

C# 以逗号分隔的列表,并带有“QUOTE”;及;代替最后一个逗号,c#,string,linq,list,C#,String,Linq,List,我想在C#中创建一个逗号分隔的列表,最后一个分隔符是“and” string.Join(", ", someStringArray) 将产生如下字符串 Apple, Banana, Pear 但我希望它看起来像这样: Apple, Banana and Pear 是否有一种简单的方法可以使用Linq和实现它,而不使用循环?您可以对除最后一个项目之外的所有项目进行连接,然后手动添加最后一个项目: using System; using System.Linq; namespace Stac

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

string.Join(", ", someStringArray)
将产生如下字符串

Apple, Banana, Pear
但我希望它看起来像这样:

Apple, Banana and Pear

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

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

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);
        }
    }
}
使用系统;
使用System.Linq;
命名空间堆栈溢出
{
班级计划
{
静态void Main(字符串[]参数)
{
DumpResult(新字符串[]{});
DumpResult(新字符串[]{“Apple”});
DumpResult(新字符串[]{“Apple”,“Banana”});
DumpResult(新字符串[]{“Apple”、“Banana”、“Pear”});
}
私有静态void DumpResult(字符串[]someStringArray)
{
string result=string.Join(“,”,someStringArray.Take(someStringArray.Length-1))+(someStringArray.Length一种可能的解决方案:

var items = someStringArray; // someStringArray.ToList() if not a ICollection<>
var s = string.Join(", ", items.Take(items.Count() - 1)) +
        (items.Count() > 1 ? " and " : "") + items.LastOrDefault();
var items=someStringArray;//someStringArray.ToList()如果不是ICollection
var s=string.Join(“,”,items.Take(items.Count()-1))+
(items.Count()>1?,:“)+items.LastOrDefault();
请注意,如果此语句未实现
ICollection
(列表和数组实现它),则它可以多次迭代
someStringArray
。如果是这样,请使用集合创建一个列表并对其执行查询

有没有一种简单的方法可以在不使用循环的情况下使用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;
    }
字符串组合(IEnumerable列表)
{
bool start=true;
var last=string.Empty;
String str=String.Empty;
foreach(列表中的变量项)
{
如果(!开始)
{
str=str+“,”+项;
最后一项=项目;
}
其他的
{
str=项目;
开始=错误;
} 
}
如果(!string.IsNullOrWhiteSpace(last))
{
str=str.Replace(“,“+last”和“+last”);
}
返回str;
}

项目是否必须以当前的顺序出现,或者我们可以重新排列它们?它们应该以相同的顺序出现。
并且不使用循环
——答案证明,你不需要显式循环。然而,循环并不是邪恶的,LINQ实际上只是为你生成循环。如果你要求这样做如果没有循环,您将得到不太可读的答案。我知道Linq在内部生成循环。但是,从可读性的角度来看,我发现Linq更好。一旦您进入LinqToSql,您就不能再没有它了;)很好,但是如果列表包含的项目少于两个呢?那么,我们需要使用以下内容:string days=string.Join(“,”,notSentDays.Take(notSentDays.Count-1))+(notSentDays.Count==1?”:“and”)+notSentDays.Last();我更愿意使用
字符串,string[],int,int
重载比
IEnumerable
重载大。如果数组有一个项,则结果是一个空字符串。@juharr没有。我已经测试过了。有一个项,它只显示该项。不添加“,”或“and”。与0、1和2+项完美配合使用。很好!@JonB:“完美地处理0项”是什么意思。应该发生什么?@MarkByers-它返回“”,而不是导致异常或返回类似“、”和”的内容。如果列表足够长,多个循环可能会出现性能问题。因为大约有5个条目,性能并不重要。我使用Linq的原因是为了避免使用意大利面代码。这个项目大约有10个人在工作,所以我们不能用性能来换取这样的可读性。但是谢谢你的回答。@Devils,如果有的话e是使用
StringBuilder
而不是
String
的多个条目。否则,这是比任何其他
LINQ
查询更有效的解决方案。我总是尝试在LINQ中执行所有操作(因为它是可读的),但当性能问题出现时,使用LINQ>编写最差的代码很容易