我有一个列表与数字区域,我想建立一个所有数字的列表我该怎么办?

时间:2012-12-15 07:14:20

标签: c#

我有一个列表,如下所示:

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会包含一行中的所有数字。

我该怎么做?

3 个答案:

答案 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();