2012-08-07 66 views
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來實現這樣的結果?我看到如何使用for循環很容易實現這一點,但我想知道是否會有更乾淨的方式來使用Linq來做到這一點,我似乎無法找到任何。

+0

它總是3個隨機文本在一個標題內嗎?或者這是一個靈活的金額? – Maarten 2012-08-07 08:55:41

+0

嘿馬騰,它是一個靈活的randomTexts數量,因爲它是標題。 – Louitbol 2012-08-07 10:24:42

+0

如何識別一行是標題還是隨機文本? – Maarten 2012-08-07 10:33:32

回答

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