Ограниченная запятой строка из списка элементов

Есть ли простой способ создать строку с разделителями-запятыми из списка элементов без , добавив дополнительные «,» в конец строки?

Мне часто нужно взять ASP.NET CheckBoxList и форматировать выбранные значения в виде строки для вставки в сообщение электронной почты. Прямо перемещать выбранные флажки, получать значения и добавлять их в StringBuilder с «,» разделяя их, но свойство Count возвращает количество элементов в общем количестве списков, а не количество элементов, которые действительно выбраны , Так что трудно узнать, когда вы достигли последнего элемента, и в итоге вы попадаете в блуждающее «,» в конце.

Я играл с несколькими различными подходами к этой проблеме. В последнее время я делал что-то вроде этого:

private string ConcatenateCheckBoxListItems()
{
    StringBuilder sb = new StringBuilder();
    char[] characters = new char[] {" ", ","};
    String trimmedString;

    foreach (ListItem item in MyList)
    {
        sb.Append(item.Value + ", ");
    }

    trimmedString = sb.ToString().TrimEnd(characters);
    return trimmedString;
}

Но это определенно неуклюже. Так делают различные для петли подходы, которые я пробовал. Любые предложения по более чистой реализации?

47 голосов | спросил Josh Earl 3 MarpmThu, 03 Mar 2011 19:20:24 +03002011-03-03T19:20:24+03:0007 2011, 19:20:24

4 ответа


57

Этого было бы недостаточно?

private string ConcatenateCheckBoxListItems()
{
    return string.Join(", ", from item in MyList select item.Value);
}
ответил pdr 3 MarpmThu, 03 Mar 2011 19:35:02 +03002011-03-03T19:35:02+03:0007 2011, 19:35:02
24

Почему бы не string.Join()?

var result = string.Join(", ", MyList.Items.Select(i => i.Value));
ответил Snowbear 3 MarpmThu, 03 Mar 2011 19:36:14 +03002011-03-03T19:36:14+03:0007 2011, 19:36:14
5

string.Join() - хороший ответ, но я предпочитаю создавать метод расширения:

namespace StringExtensions
{
    static class _
    {
        public static string JoinString<T>(this IEnumerable<T> source, string seperator = "")
        {
            return string.Join(seperator, source);
        }
    }
}

, который используется следующим образом:

return MyList.Select(i => i.Value).JoinString(", ");

(Я использую мой нетрадиционный метод организации методов расширения, о котором вы можете прочитать здесь: http://jbazuzicode.blogspot.com/2009/01/way-to-manage-extension-methods-in-c.html ).

ответил Jay Bazuzi 4 MaramFri, 04 Mar 2011 02:43:50 +03002011-03-04T02:43:50+03:0002 2011, 02:43:50
1

Как pdr отметили, что лучше использовать String.Join , вместо того, чтобы делать это самостоятельно, как я сказал ранее.

  

Может, мне что-то не хватает, но не могу   вы просто делаете следующее?

private string ConcatenateCheckBoxListItems()
{
    StringBuilder sb = new StringBuilder();

    for ( int i = 0; i < MyList.Items.Count; ++i )
    {
        ListItem item = MyList.Items[ i ];
        sb.Append( item.Value );
        if ( i < MyList.Items.Count - 1 )
        {
            sb.Append( ", " );
        }
    }

    return sb.ToString();
}
     

UPDATE:

     

Как оповещение, я знаю, что легко   быстро потерять обзор   с таким кодом. Вот почему   Я работал над экспериментальным   класс, который позволяет   Следующий.

StringBuilder sb = new StringBuilder();
Loop loop = Loop.ForEach( MyList.Items, i => sb.Append( i.Value ) );
loop.After.AllButLast( () => sb.Append( ", " ) );
loop.Run();
     

Я все еще решаю, действительно ли я   как это решение. :) Не использовал его   что часто.

ответил Steven Jeuris 3 MarpmThu, 03 Mar 2011 19:30:48 +03002011-03-03T19:30:48+03:0007 2011, 19:30:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132