-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 である次の反復に追加し、再び数値を取得して追加する必要があります。それらをリストに

最終的に、リストにはすべての数字が 1 つの大きな行に含まれます。

どうすればできますか?

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

SelectMany は連結されたサブシーケンスのシーケンスを提供するため、次のようにすると、各範囲内のすべての数値のリストが得られます。

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

LR の内容はわかりませんが、有効な int として範囲番号を持っていると仮定します (そうでない場合は、正規表現または String.IndexOf を使用して検索する必要があります)。

ただし、オブジェクトが次のように見えるオブジェクトのリストがある場合:

class pairs
{  
int item1;   
int item2;    
}  

次に、次のことを簡単に行うことができます ( Enumerable.Range を参照) Enumerable.Range
は、start と count の 2 つのパラメーターを受け入れます。カウントを取得するには、下限から上限を減算し、上限値を含めるために 1 を追加する必要があります。

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 に答える