Вы можете легко сделать это в других базах данных с помощью рекурсивного запроса (YMMV на производительность).
Другой способ сделать это - сохранить два дополнительных бита данных, левый и правый стоимость. Левое и правое значение получены из предварительного предпросмотра древовидной структуры, которую вы представляете.
Это известно как измененный обход дерева предзаказов и позволяет запускать простой запрос, чтобы получить все родительские значения в один раз. Он также имеет название «вложенный набор».
Вот решение с использованием регулярных выражений:
List<double> numbers = new Regex(@"(\d+)\*x").Matches(line)
.Cast<Match>()
.Select(m => double.Parse(m.Groups[1].Value))
.ToList();
EDIT: обновлено для анализа чисел.
Вы можете попробовать это.
string line = "14*x1 + 2*x2 + 3*x3 = 2";
var arr = line.Split('+');
var result = arr.Select(x => x.Substring(0, x.IndexOf('*')));
Простой RegEx (\d+)\*
должен сделать трюк.
var line = "14*x1 + 2*x2 + 3*x3 = 2";
var matches = Regex.Matches(line, @"(\d+)\*");
// [] { 14, 2 , 3 }
var numbers = matches.Select(x => double.Parse(x.Groups[1].Value)).ToArray();
.Select()
на matches
.
– itsme86
13 July 2018 в 19:43
System.Text.RegularExpressions
@ 4.2.1.0, я предполагаю, что вы используете старую устаревшую версию? 4.0.0.0? nuget.org/packages/System.Text.RegularExpressions/4.3.0
– Kevin Smith
13 July 2018 в 19:54
System.Text.RegularExpressions
, вам не нуженCast<Match>
, посколькуMatchCollection
уже наследуетICollection<Match>, IEnumerable<Match>, IEnumerable, IList<Match>, IReadOnlyCollection<Match>, IReadOnlyList<Match>, ICollection, IList
– Kevin Smith 13 July 2018 в 19:55double answer = double.Parse(new Regex(@"=\W*(\d+)").Match(line).Groups[1].Value);
– itsme86 13 July 2018 в 20:12