3

通过自然的外观,我的意思是:

项目 1、项目 2、项目 3 和项目 4。

我知道你可以用逗号分隔列表string.Join,比如

第 1 项、第 2 项、第 3 项、第 4 项

但是你怎么能做出这样的清单呢?我有一个基本的解决方案:

int countMinusTwo = theEnumerable.Count() - 2;
string.Join(",", theEnumerable.Take(countMinusTwo)) + "and " 
    + theEnumerable.Skip(countMinusTwo).First();

但我很确定有更好的(如更有效的)方法来做到这一点。任何人?谢谢。

4

2 回答 2

2

您应该计算一次大小并将其存储在变量中。否则每次都会执行查询(如果它不是集合)。此外,Last如果您想要最后一项,则更具可读性。

string result;
int count = items.Count();
if(count <= 1)
    result = string.Join("", items);
else
{
    result = string.Format("{0} and {1}"
        , string.Join(", ", items.Take(counter - 1))
        , items.Last());
}

如果可读性不太重要并且序列可能很大:

var builder = new StringBuilder();
int count = items.Count();
int pos = 0;
foreach (var item in items)
{
    pos++;
    bool isLast = pos == count;
    bool nextIsLast = pos == count -1;
    if (isLast)
        builder.Append(item);
    else if(nextIsLast)
        builder.Append(item).Append(" and ");
    else
        builder.Append(item).Append(", ");
}
string result = builder.ToString();
于 2013-07-23T11:17:44.833 回答
1

I would have worked with a string.

Let's say you have :

string items = "item1, item2, item3, item4";

Then you could do :

int lastIndexOf = items.LastIndexOf(",");
items = items.Remove(lastIndexOf);
items = items.Insert(lastIndexOf, " and");
于 2013-07-23T11:20:55.577 回答