2012-08-07 1 views
0

나는 그런 내가 익명 형식의 목록을 가져올 수 Linq를 사용하고 할 싶습니다 이것이 하나그룹화

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. 

로 문자열 목록이 같은

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

내가 Linq 개체와 같은 결과를 얻을 수있는 방법이 있습니까? 나는 루프를 사용하여 이것을 달성하는 것이 얼마나 쉬운 지 알지만, Linq를 사용하여 이것을 수행하는 더 깨끗한 방법이 있을지 궁금하다. 나는 찾을 수없는 듯하다.

+0

하나의 제목에는 항상 3 개의 임의 텍스트가 있습니까? 아니면 유연한 금액입니까? – Maarten

+0

안녕하세요, Maarten입니다. Headings와 마찬가지로 유연한 양의 randomTexts입니다. – Louitbol

+0

행이 제목인지 무작위 텍스트인지 어떻게 알 수 있습니까? – Maarten

답변

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