Ответ 1
var delimitedString = selectedValues.Aggregate((x,y) => x + ", " + y);
Каков подход функционального программирования для преобразования IEnumerable<string>
в строку с разделителями? Я знаю, что могу использовать цикл, но я пытаюсь обернуть голову вокруг функционального программирования.
Вот мой пример:
var selectedValues =
from ListItem item in checkboxList.Items
where item.Selected
select item.Value;
var delimitedString = ??
.. или я могу сделать это только в первом назначении var (добавьте каждый результат к предыдущему)?
var delimitedString = selectedValues.Aggregate((x,y) => x + ", " + y);
string.Join(", ", string[] enumerable)
Вот пример с StringBuilder
. Самое приятное, что Append()
возвращает сам экземпляр StringBuilder
.
return list.Aggregate( new StringBuilder(),
( sb, s ) =>
( sb.Length == 0 ? sb : sb.Append( ',' ) ).Append( s ) );
var delimitedString = string.Join(",", checkboxList.Items.Where(i => i.Selected).Select(i => i.Value).ToArray());
AviewAnew - лучший ответ, но если то, что вы ищете, это научиться думать о функциональности, то вам следует использовать операцию сгиба (или совокупность, как она называется в NET).
items.Aggregate((accum, elem) => accum + ", " + elem);
Ну, в этом случае функциональный подход может быть не самым подходящим, просто потому, что 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 - отличный инструмент, но не всегда всегда лучший инструмент для каждой работы)
Здесь LINQ/функциональный способ сделать это.
string[] toDelimit = CallSomeFunction();
return toDelimit.Aggregate((x, y) => x + "," + y);
Это совместимо с 3.5:
var selectedValues = String.Join(",", (from ListItem item in checkboxList.Items where item.Selected select item.Value).ToArray());