С# Как поместить запятую после каждого слова, кроме последнего в списке
Я совершенно новый для С# и обучения, когда я иду. Я застрял в вопросе, который я надеюсь, что опытный программист может помочь. Я добавил CheckedListBox в свою форму и добавил к нему коллекцию из 6 элементов. Мне нужен все, кроме последнего элемента, выбранного для запятой, рядом с ним, поэтому мой вопрос: как я могу сказать С# NOT поместить запятую рядом с последним выбранным элементом?
foreach (object itemChecked in RolesCheckedListBox.CheckedItems)
{
sw.Write(itemChecked.ToString() + ",");
}
Спасибо за полученную помощь!
Dan
Ответы
Ответ 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));
Ответ 5
В 4.0 вы можете просто использовать string.Join(разделитель строк, значения IEnumerable), который вызывает метод ToString() для всех непустых значения:
var commaSeparated = 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 для этой проблемы.