Я бы использовал .reduce
. Сначала разделите начальную строку запятыми. Если для перебираемой строки нет -
, просто введите число в накопитель; в противном случае разделите на -
, чтобы получить числа low
и high
, затем используйте петлю for
, чтобы протолкнуть все числа от low
до high
к аккумулятору:
]
const ToInt = Number;
const numArr = "7, 20, 22, 30–31, 33, 39–40, 46".split(', ');
const result = numArr.reduce((a, str) => {
if (!str.includes('–')) {
a.push(ToInt(str));
return a;
}
const [low, high] = str.split('–');
for (let i = Number(low); i <= high; i++) {
a.push(i);
}
return a;
}, []);
console.log(result);
Если по какой-то причине вы не хотите использовать ES6, вы можете преобразовать его в ES5 с помощью Вавилона :
"use strict";
function _slicedToArray(arr, i) {
return (
_arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest()
);
}
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}
function _iterableToArrayLimit(arr, i) {
var _arr = [];
var _n = true;
var _d = false;
var _e = undefined;
try {
for (
var _i = arr[Symbol.iterator](), _s;
!(_n = (_s = _i.next()).done);
_n = true
) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"] != null) _i["return"]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
var ToInt = Number;
var numArr = "7, 20, 22, 30–31, 33, 39–40, 46".split(", ");
var result = numArr.reduce(function(a, str) {
if (str.indexOf("–") === -1) {
a.push(ToInt(str));
return a;
}
var _str$split = str.split("–"),
_str$split2 = _slicedToArray(_str$split, 2),
low = _str$split2[0],
high = _str$split2[1];
for (var i = Number(low); i <= high; i++) {
a.push(i);
}
return a;
}, []);
console.log(result);
(но версия ES6 более краткая и, вероятно, много легче читать и понимать)
Краткий ответ : Вам не нужно создавать DataContext самостоятельно. LINQPad поставляется с множеством примеров, взгляните на них.
Когда вы подключаете LINQPad к базе данных, он создает для вас DataContext. Таблицы DataContext ( Table
) и SubmitChanges ()
доступны как локальные члены.
Например, для режима «Выражение C #» LINQPad по умолчанию вы можете просто написать:
from p in Person
where p.Name == "Joe"
select p.Address
В режиме «Оператор C #» LINQPad:
var query = from p in Person
where p.Name == "Joe"
select p.Address;
query.Dump(); // Dump() shows results below
Person joe = query.First();
joe.Name = "Peter";
SubmitChanges();
joe.Dump(); // shows joe's values under the previous query results
Метод расширения LINQPad Dump ()
очень полезен, его можно вызвать для любого объекта или коллекции (в режиме оператора LINQPad), чтобы показать результаты ниже.
Обратите внимание, что вам даже не нужно подключаться в базу данных, чтобы использовать LINQPad. Вы можете работать с коллекциями в памяти:
int[] numbers = new[] { 1, 2, 3, 4, 5 };
numbers.Where(n => n > 3).Select(n => n * 2).Dump();
Фактически, вам даже не нужно использовать LINQ для использования LINQPad. Он также отлично работает как компилятор сниппетов.
s Метод расширения Dump ()
очень полезен, его можно вызвать для любого объекта или коллекции (в режиме оператора LINQPad), чтобы показать результаты ниже.
Обратите внимание, что вам даже не нужно подключаться к база данных для использования LINQPad. Вы можете работать с коллекциями в памяти:
int[] numbers = new[] { 1, 2, 3, 4, 5 };
numbers.Where(n => n > 3).Select(n => n * 2).Dump();
Фактически, вам даже не нужно использовать LINQ для использования LINQPad. Он также отлично работает как компилятор сниппетов.
s Метод расширения Dump ()
очень полезен, его можно вызвать для любого объекта или коллекции (в режиме оператора LINQPad), чтобы показать результаты ниже.
Обратите внимание, что вам даже не нужно подключаться к база данных для использования LINQPad. Вы можете работать с коллекциями в памяти:
int[] numbers = new[] { 1, 2, 3, 4, 5 };
numbers.Where(n => n > 3).Select(n => n * 2).Dump();
Фактически, вам даже не нужно использовать LINQ для использования LINQPad. Он также отлично работает как компилятор сниппетов.
Я знаю, что на этот вопрос уже есть ответ, и я согласен с Лукасом, но хотел добавить пару вещей, которые могут помочь читателям этого вопроса.
Вы можете загрузить свой собственный DataContext из сборки если вы хотите. Независимо от того, загружаете ли вы свой собственный контекст или позволяете LinqPad создать его для вас, вы работаете в контексте класса «UserQuery», который генерируется LinqPad.
Следующий статус C # показывает это:
this.GetType().Name.Dump(); // Shows UserQuery
Этот класс UserQuery происходит от DataContext. В этом примере я позволил Linqpad создать контекст данных для базы данных AdventureWorks:
this.GetType().BaseType.Dump(); // Shows TypedDataContext
Если я загружу свой собственный DataContext с именем MyDataContext:
this.GetType().BaseType.Dump(); // Shows MyDataContext