-1

我有一个列表,看起来像这样:

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

因此,新的列表将包含所有数字。

要计算长度,例如 32 或 22 我正在做:

int len = LR[i].end - LR[i].start;

Lr[i].end 是 73,Lr[i].start 是 41

所以我需要计算并获取 41 到 73 之间的所有数字,包括 41 和 73,然后将它们添加到新列表中,然后到下一个迭代,其中 LR[i].end 是 103,开始是 81,然后再次获取数字并添加他们到名单

所以最后列表将包含一大行中的所有数字。

我该怎么做 ?

4

3 回答 3

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();
于 2012-12-15T07:58:43.340 回答
0

我不确定 LR 的内容是什么,但我假设您将范围编号作为有效的整数(否则,您将不得不使用 regex 或 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
于 2012-12-15T07:51:25.927 回答
0

SelectMany 将为您提供一个连接的子序列序列,因此以下将为您提供每个范围内所有数字的列表。

ranges.SelectMany(r => Enumerable.Range(r.start, r.end - r.start + 1)).ToList();
于 2012-12-15T07:57:12.443 回答