Присоединение к списку другим способом - PullRequest
3 голосов
/ 06 июня 2011

Язык: C # 4.0

Существует List<string> со значениями Value1, Value2, Value3 и т. Д.
Я хотел бы выполнить объединение в общем списке так, чтобы вывод был

string values = "Value1, Value2 and Value3"; 

и, если есть только одно значение

string values = "Value1"; 

В настоящее время я заменяю LastIndexOf , на and. Но не очень понравилось.
Какой самый эффективный способ присоединиться?

Ответы [ 7 ]

4 голосов
/ 06 июня 2011
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.Count; i++)
{
  if (i == sb.Count - 1)
  {
    sb.Append(" and ");
  }
  else if (i > 0)
  {
    sb.Append(", ");
  }
  sb.Append(list[i])
}
3 голосов
/ 06 июня 2011

Мне лично нравится использовать методы из пространства имен Enumerable для таких задач:)

List<string> values = new List<string>() { "Value1", "Value2", "Value3"};
string result = "";
if (values.Count == 1) {
    result = values[0];
}
else if (values.Count > 1 ) {
    var init = values.Take(values.Count - 1);
    var temp = init.Aggregate((acc, x) => acc + ", " + x);
    temp += " and " + values[values.Count -1];
    result = temp;
}
2 голосов
/ 06 июня 2011

Не глупый ответ:

var sb = new StringBuilder();
for(int i = 0; i < items.Count; i++)
{
    if(i != 0)
    {
        if(i == items.Count-1) sb.Append(" and ");
        else sb.Append(", ");
    }
    sb.Append(items[i]);
}
return sb.ToString();

Если вы хотите выполнить операцию, имеющую несколько особых случаев (без запятой или конечной запятой, а последняя запятая на самом деле " and "), самый простой способ - просто написать особые случаи.

2 голосов
/ 06 июня 2011

Для этого вы можете использовать функцию String.Join(string glue, string[] array);.

string values = String.Join(", ", myList.ToArray());

Надеюсь, это поможет. ( Примечание: myList - это список, который у вас уже есть в вашем приложении.)

Обновление: Заметили, что ваши и слишком поздно, мои извинения, вот небольшое обновление:

string values = String.Join(", ", myList.Take(myList.Count - 1)) 
                   + " and " + myList.Last();

В качестве альтернативы (или, может быть, даже лучше) вы можете использовать для этого StringBuilder вместо конкатенации строк. ( Помните: Вам все равно придется проверить, есть ли в списке только одно значение.)

Обновление: вот простой метод расширения.

public static string SmartJoin(this List<string> items, string lastSeparator)
{
    string values = "";
    if(!items.Any())
    {
        return "";
    }
    if (items.Count > 1)
    {
        values = String.Format("{0} {1} {2}",
                    String.Join(", ", items.Take(items.Count - 1)),
                    lastSeparator,
                    items.Last());
    }
    else
    {
        values = items.First();
    }
    return values;
}

И это можно назвать как

string values = myList.SmartJoin("and");
1 голос
/ 06 июня 2011
var sb = new StringBuilder();
if (yourList.Count > 0)
{
    sb.Append(yourList[0]);

    if (yourList.Count > 1)
    {
        for (int i = 1; i < yourList.Count - 1; i++)
        {
            sb.Append(", ").Append(yourList[i]);
        }

        sb.Append(" and ").Append(yourList[yourList.Count - 1]);
    }
}
string values = sb.ToString();
1 голос
/ 06 июня 2011

Метод:

private static string ConvertToString(List<string> list)
{
    if (!list.Any())
    {
        return string.Empty;
    }

    if (list.Count == 1)
    {
        return list.First();
    }

    return string.Join(", ", list.Take(list.Count - 1)) + " and " + list.Last();
}

примеры

var list1 = new List<string> { "Value1", "Value2", "Value3", "Value4" };
var list2 = new List<string> { "Value1", "Value2", "Value3" };
var list3 = new List<string> { "Value1", "Value2" };
var list4 = new List<string> { "Value1" };
Console.WriteLine(ConvertToString(list1));
Console.WriteLine(ConvertToString(list2));
Console.WriteLine(ConvertToString(list3));
Console.WriteLine(ConvertToString(list4));

ПРИМЕЧАНИЕ: я использую код .net 4

ОБНОВЛЕНИЕ: удален ненужный код ОБНОВЛЕНИЕ2: сделал некоторыеДля оптимизации кода использованы некоторые советы формы @ KilZone

1 голос
/ 06 июня 2011

Вы можете присоединиться, используя следующую функцию:

 public string SmartJoin(string lastSeparator, List<string> array)
 {
   var lastElementPosition = array.Count - 1;
   var lastValue = array[lastElementPosition];
   array.RemoveAt(lastElementPosition);

   return String.Join(lastSeparator, new[] { String.Join(", ", array), lastValue });
 }

Пример:

   var items = new List<string> { "Value1", "Value2", "Value3" };
   var result =  SmartJoin(" and ", items);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...