Вы можете использовать рекурсию. Для любого заданного числа в наборе найдите комбинации меньших чисел, которые добавляются до числа:
public static IEnumerable<string> GetCombinations(int[] set, int sum, string values) {
for (int i = 0; i < set.Length; i++) {
int left = sum - set[i];
string vals = set[i] + "," + values;
if (left == 0) {
yield return vals;
} else {
int[] possible = set.Take(i).Where(n => n <= sum).ToArray();
if (possible.Length > 0) {
foreach (string s in GetCombinations(possible, left, vals)) {
yield return s;
}
}
}
}
}
Использование:
int[] set = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
foreach (string s in GetCombinations(set, 18, "")) {
Console.WriteLine(s);
}
Выход:
1,2,4,5,6,
3,4,5,6,
1,2,3,5,7,
2,4,5,7,
2,3,6,7,
1,4,6,7,
5,6,7,
1,2,3,4,8,
2,3,5,8,
1,4,5,8,
1,3,6,8,
4,6,8,
1,2,7,8,
3,7,8,
2,3,4,9,
1,3,5,9,
4,5,9,
1,2,6,9,
3,6,9,
2,7,9,
1,8,9,
1,3,4,10,
1,2,5,10,
3,5,10,
2,6,10,
1,7,10,
8,10,
ECMAScript 6 (ES6) представляет новый тип литерала, а именно шаблонные литералы . У них много функций, среди них переменная интерполяция, но, что важнее всего, в этом вопросе они могут быть многострочными.
Литерал шаблона отделяется обратными чертами :
var html = `
<div>
<span>Some HTML here</span>
</div>
`;
(Примечание: я не защищаю использовать HTML в строках)
Поддержка браузера в порядке , но вы можете использовать транспортеры для большей совместимости.
Javascript здесь нет Синтаксис документа. Однако вы можете избежать буквального перехода на новую строку:
"foo \
bar"
Вы можете сделать это ...
var string = 'This is\n' +
'a multiline\n' +
'string';
the pattern text = << "HERE" Эта многострочная строка ЗДЕСЬ
недоступна в js (я помню, как много раз ее использовал в старые добрые времена Perl).
Для контроля над сложными или длинными многострочными строками я иногда использую шаблон массива:
var myString =
['<div id="someId">',
'some content<br />',
'<a href="#someRef">someRefTxt</a>',
'</div>'
].join('\n');
или уже показанный анонимный шаблон (экранирование новой строки), который может быть уродливым блоком в вашем коде:
var myString =
'<div id="someId"> \
some content<br /> \
<a href="#someRef">someRefTxt</a> \
</div>';
Вот еще один странный, но рабочий 'трюк' 1 :
var myString = (function () {/*
<div id="someId">
some content<br />
<a href="#someRef">someRefTxt</a>
</div>
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
внешнее редактирование: jsfiddle
ES20xx поддерживает растягивающие строки в нескольких строках с использованием шаблонных строк :
let str = `This is a text
with multiple lines.
Escapes are interpreted,
\n is a newline.`;
let str = String.raw`This is a text
with multiple lines.
Escapes are not interpreted,
\n is not a newline.`;
1 Примечание: это будет потеряно после минимизации / запутывания вашего кода