Подтвердить что ты не робот

С# Как поместить запятую после каждого слова, кроме последнего в списке

Я совершенно новый для С# и обучения, когда я иду. Я застрял в вопросе, который я надеюсь, что опытный программист может помочь. Я добавил CheckedListBox в свою форму и добавил к нему коллекцию из 6 элементов. Мне нужен все, кроме последнего элемента, выбранного для запятой, рядом с ним, поэтому мой вопрос: как я могу сказать С# NOT поместить запятую рядом с последним выбранным элементом?

foreach (object itemChecked in RolesCheckedListBox.CheckedItems)
{
    sw.Write(itemChecked.ToString() + ",");
}

Спасибо за полученную помощь! Dan

4b9b3361

Ответ 1

Для улучшения вашего примера может быть:

var index = 0;
foreach (object itemChecked in RolesCheckedListBox.CheckedItems)
{
    if ( index>0 ) sw.Write( "," );
    sw.Write(itemChecked.ToString());
    index++;
}

Не элегантный, но рабочий.

Ответ 2

Это можно сделать, используя string.Join() метод:

string commaSeparated = string.Join(",", 
                RolesCheckedListBox.CheckedItems.Select(item => item.ToString());

Например:

string[] names = new []{ "a", "b"};
string separatedNames = string.Join(",", names);

В результате получится separatedNames "a,b"

Ответ 3

Вот несколько статей, которые я написал об этой проблеме:

http://blogs.msdn.com/b/ericlippert/archive/2009/04/13/restating-the-problem.aspx

http://blogs.msdn.com/b/ericlippert/archive/2009/04/15/comma-quibbling.aspx

Комментарии ко второй статье содержат десятки решений для более сложной версии проблемы; это образовательные, чтобы просмотреть эти решения и посмотреть, какие из них вы найдете элегантными и какие из них вы найдете грубыми.

Ответ 4

Вы можете использовать функцию Join вместо цикла:

sw.Write(string.Join(",", RolesCheckedListBox.CheckedItems));

Ответ 6

  • преобразуйте ListItemCollection в строковый массив, используя linq
  • используйте String.Join

Как

public string ItemsToString(ListItemCollection items)
{
    string[] stringArray = (from ListItem item in items where item.Selected select item.ToString()).ToArray();
    return String.Join(", ", stringArray);
}

вы можете использовать его

sw.Write(ItemsToString(RolesCheckedListBox.CheckedItems));

Или, если вы предпочитаете одну строку для задания:

sw.Write(String.Join(", ", (from ListItem item in RolesCheckedListBox.CheckedItems select item.ToString()).ToArray()));

Ответ 7

В .Net 4 вы можете использовать статический String.Join<T> Method (String, IEnumerable<T>) и печатать конкатенированную строку.

В противном случае простым способом является добавление запятой ко всем элементам, но первая:

bool shouldPrependComma = false;
foreach (object itemChecked in RolesCheckedListBox.CheckedItems) 
{
  if (shouldPrependComma) sw.Write(",");
  sw.Write(itemChecked.ToString());
  shouldPrependComma = true;
}

Ответ 8

foreach (object itemChecked in RolesCheckedListBox.Items)
            {
                if (itemChecked != RolesCheckedListBox.Items[RolesCheckedListBox.Items.Count - 1])
                    sw.Write(itemChecked.ToString() + ",");
            }

Это должно помочь вам. Кроме того, я просто использовал "Items", вы использовали CheckedItems. Измените все экземпляры Items на CheckedItems, если вы хотите только перебирать отмеченные элементы.

Ответ 9

Jon Skeet внедрил SmartEnumerable для этой проблемы.