С# - IEnumerable для строки с разделителями

Каков подход функционального программирования для преобразования IEnumerable<string> в строку с разделителями? Я знаю, что могу использовать цикл, но я пытаюсь обернуть голову вокруг функционального программирования.

Вот мой пример:

var selectedValues =
from ListItem item in checkboxList.Items
where item.Selected
select item.Value;

var delimitedString = ??

.. или я могу сделать это только в первом назначении var (добавьте каждый результат к предыдущему)?

Ответы

Ответ 1

var delimitedString = selectedValues.Aggregate((x,y) => x + ", " + y);

Ответ 2

string.Join(", ", string[] enumerable)

Ответ 3

Вот пример с StringBuilder. Самое приятное, что Append() возвращает сам экземпляр StringBuilder.

  return list.Aggregate( new StringBuilder(), 
                               ( sb, s ) => 
                               ( sb.Length == 0 ? sb : sb.Append( ',' ) ).Append( s ) );

Ответ 4

var delimitedString = string.Join(",", checkboxList.Items.Where(i => i.Selected).Select(i => i.Value).ToArray());

Ответ 5

AviewAnew - лучший ответ, но если то, что вы ищете, это научиться думать о функциональности, то вам следует использовать операцию сгиба (или совокупность, как она называется в NET).

items.Aggregate((accum, elem) => accum + ", " + elem);

Ответ 6

Ну, в этом случае функциональный подход может быть не самым подходящим, просто потому, что LINQ "ForEach" отсутствует, и вы не хотите использовать конкатенацию строк: вы хотите использовать StringBuilder. Вы можете использовать ToArray (пример, который только что появился выше), но у меня возникнет соблазн просто использовать:

    StringBuilder sb = new StringBuilder();
    foreach(ListViewItem item in checkboxList.SelectedItems) {
        if(sb.Length > 0) sb.Append(',');
        sb.Append(item.Text);
    }
    string s = sb.ToString();

Не функциональное программирование, но оно работает... конечно, если ваш источник уже является строкой [], тогда string.Join совершенен. (LINQ - отличный инструмент, но не всегда всегда лучший инструмент для каждой работы)

Ответ 7

Здесь LINQ/функциональный способ сделать это.


string[] toDelimit = CallSomeFunction();
return toDelimit.Aggregate((x, y) => x + "," + y);

Ответ 8

Это совместимо с 3.5:

var selectedValues = String.Join(",", (from ListItem item in checkboxList.Items where item.Selected select item.Value).ToArray());