0

このような文字列のリストがあります

heading1 00:01:20
randomText
01:23
randomText2
01:45
randomText3
02:10
heading2 00:05:20
randomText4
07:25
randomText5
04:35
randomText6
09:12
etc.

私がやりたいのは、Linq を使用して、次のような匿名型のリストを取得することです。

{ Name = "randomText1", Category = "Heading1", Duration = "01:23"}
{ Name = "randomText2", Category = "Heading1", Duration = "01:45"}
...
{ Name = "randomText6", Category = "Heading2", Duration = "09:12"}

Linq to Objects でこのような結果を達成する方法はありますか? forループを使用してこれを簡単に実現できることはわかりましたが、Linqを使用してこれを行うためのよりクリーンな方法があるかどうか疑問に思っていますが、見つけられないようです。

4

1 に答える 1

0

これは、次の条件でトリックを行います。

1) 見出し行を認識できます。定数値で始まります (必要に応じてこの条件を変更できます)。

2) すべての「ランダムテキスト」行について、対応する期間行を見つけることができます。

var data = new List<string>() {
    "heading1 00:01:20",
    "randomText       ",
    "01:23            ",
    "randomText2      ",
    "01:45            ",
    "randomText3      ",
    "02:10            ",
    "heading2 00:05:20",
    "randomText4      ",
    "07:25            ",
    "randomText5      ",
    "04:35            ",
    "randomText6      ",
    "09:12            "
};

const string HEADINGSTART = "heading";                      // TODO: Set correct value
var temp = Enumerable.Range(0, data.Count - 1)              // Iterate based on index
    .Where(i => data[i].StartsWith(HEADINGSTART))           // Find the headings
    .Select(i => new {                                      // Project to heading + data
        Heading = data[i],
        Data = data.Skip(i + 1).TakeWhile(d => !d.StartsWith(HEADINGSTART)).ToList()
    })
    .SelectMany(d => d.Data.Select(d2 => new {              // Project to single enumerable
        Heading = d.Heading,
        Data = d2
    }))
    .ToList();
var result = Enumerable.Range(0, temp.Count / 2)            // Again, iterate based on index
    .Select(i => new {                                      // Project to requested object
        Name = temp[i * 2].Data,
        Category = temp[i * 2].Heading,
        Duration = temp[i * 2 + 1].Data
    })
    .ToList();
于 2012-08-07T13:39:42.620 に答える