2

我知道有几个关于如何从列表中创建逗号分隔字符串的问题已被提出 得到解答。我正在寻求一些稍微不同的帮助。

我想做的是从 a 创建一个显示友好的人类可读字符串,List<string>其内容为"A, B and C are invalid values"。字符串的语法和格式应根据列表中的项目数而改变。该列表可以包含任意数量的项目。

例如:

List<string> myString = new List<string>() { "Scooby", "Dooby", "Doo" };
// Should return "Scooby, Dooby and Doo are invalid values."

List<string> myString = new List<string>() { "Scooby", "Dooby" };
// Should return "Scooby and Dooby are invalid values."

List<string> myString = new List<string>() { "Scooby" };
// Should return "Scooby is an invalid value."

这是我到目前为止所做的:

string userMessage = "";
foreach(string invalidValue in invalidValues)
{
  userMessage = " " + userMessage + invalidValue + ",";
}

// Remove the trailing comma
userMessage = userMessage.Substring(0, userMessage.LastIndexOf(','));

if (invalidValues.Count > 1)
{
  int lastCommaLocation = userMessage.LastIndexOf(',');
  userMessage = userMessage.Substring(0, lastCommaLocation) + " and " + userMessage.Substring(lastCommaLocation + 1) + " are invalid values.";
}
else 
{
  userMessage = userMessage + " is an invalid value.";
}

有没有更好或更有效的方法来做到这一点?

4

2 回答 2

8
public static string FormatList(List<string> invalidItems)
{
    if(invalidItems.Count == 0) return string.Empty;
    else if(invalidItems.Count == 1) return string.Format("{0} is an invalid value", invalidItems[0]);
    else return string.Format("{0} and {1} are invalid values", string.Join(", ", invalidItems.Take(invalidItems.Count - 1)), invalidItems.Last());
}
于 2012-09-25T19:21:02.847 回答
0

在他的另一个答案中非常感谢@Lee,这是他的方法的一个扩展版本。它允许您指定开始文本和/或结束文本,并且它使用牛津逗号,众所周知,它的遗漏曾经在诉讼中给原告带来灾难性的后果......但如果你讨厌该死的东西,您可以按照所写的方法将其从方法中删除。

        public static string GrammaticallyCorrectStringFrom(List<string> items, string prefaceTextWithNoSpaceAtEnd, string endingTextWithoutPeriod)
    {
        var returnString = string.Empty;
        if (items.Count != 0)
        {
            returnString = prefaceTextWithNoSpaceAtEnd + " ";
        }
        if (items.Count == 1)
        {
            returnString += string.Format("{0}", items[0]);
        }
        else if (items.Count == 2)
        {
            returnString += items[0] + " and " + items[1];
        }
        else if (items.Count > 2)
        {
            //remove the comma in the string.Format part if you're an anti-Oxford type
            returnString += string.Format("{0}, and {1}", string.Join(", ", items.Take(items.Count - 1)), items.Last());
        }
        if (String.IsNullOrEmpty(returnString) == false)
        {
            returnString += endingTextWithoutPeriod + ".";
        }           
        return returnString;
    }

可能有更好、更简洁的方法来做同样的事情,但这对我有用,而且很难与结果争论。其实我猜不是,在这里,但仍然......无论如何,欢迎任何有火力来改进这一点的人。

于 2020-02-07T18:02:44.030 回答