我有一个列表,如下所示:
in index[0] "Test 0 Length 32 [41 - 73]"
in index[1] "Test 1 Length 22 [81 - 103]"
等等。
我需要从每个索引中获取所有数字。例如在新列表中我需要:41,42,43,44,45,46,47 .... 73然后从索引[1]中获取数字并在新列表中继续73之后继续81 ,82,83,84,85 .... 103
所以新的List将包含所有数字。
要计算长度,例如32或22我正在做:
int len = LR[i].end - LR[i].start;
Lr [i] .end是73而Lr [i] .start是41
所以我需要计算并得到41和73之间的所有数字,包括41和73,然后将它们添加到一个新的List然后到下一个迭代,其中LR [i] .end是103并且start是81并再次得到数字并将它们添加到列表
所以最后List会包含一行中的所有数字。
我该怎么做?
答案 0 :(得分:3)
List<string> list = new List<string>()
{
"Test 0 Length 32 [41 - 73]",
"Test 1 Length 22 [81 - 103]"
};
var numbers =
list.SelectMany(
s => Regex.Matches(s, @"\[(\d+)[ -]+(\d+)\]")
.Cast<Match>()
.Select(m => m.Groups.Cast<Group>().Skip(1).Select(x=>x.Value)
.ToArray())
.Select(x => new {start=int.Parse(x[0]), end=int.Parse(x[1]) })
.SelectMany(x => Enumerable.Range(x.start, x.end- x.start + 1))
)
.ToList();
答案 1 :(得分:0)
我不确定LR的内容是什么,但我假设您将范围编号作为有效的整数(否则,您将必须使用正则表达式或String.IndexOf来查找它们)。
但是,如果您有对象列表,其中对象如下所示:
class pairs
{
int item1;
int item2;
}
然后您可以轻松执行以下操作(请参阅Enumerable.Range)
Enumerable.Range接受两个参数:start和count。为了获得计数,我们必须从下限中减去上限并添加一个以包括上限值:
var values = new List<int>();
list.ForEach(x =>values.AddRange(Enumerable.Range(x.Item1, x.Item2 - x.Item1 + 1)));
使用Tuple工作控制台应用:
var list = new List<Tuple<int, int>>();
list.Add(Tuple.Create(41, 73));
list.Add(Tuple.Create(81, 103));
list.Add(Tuple.Create(120, 150));
// So, now we have three pair of values. 41-73, 81-103, 120-150
//Now we can loop through the list and generate sequence using Enumerable.Range like this:
var values = new List<int>();
list.ForEach(x =>values.AddRange(Enumerable.Range(x.Item1, x.Item2 - x.Item1 + 1)));
//And print out items.
values.ForEach(x => Console.WriteLine(x));
//will print 41,42,43......73, 81,82,83....,103, 120, 121,.....150
答案 2 :(得分:0)
SelectMany将为您提供连续的子序列序列,因此以下内容将为您提供每个范围内所有数字的列表。
ranges.SelectMany(r => Enumerable.Range(r.start, r.end - r.start + 1)).ToList();