Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 分组导致匿名类型_Linq_Linq Group - Fatal编程技术网

Linq 分组导致匿名类型

Linq 分组导致匿名类型,linq,linq-group,Linq,Linq Group,我有一个像这样的字符串列表 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:2

我有一个像这样的字符串列表

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对象是否有任何方法可以实现这样的结果?我知道使用for循环很容易实现这一点,但我想知道是否有更干净的方法使用Linq实现这一点,我似乎找不到任何方法。

这在以下条件下实现:

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();
var数据=新列表(){
“标题1 00:01:20”,
“随机文本”,
"01:23            ",
“随机文本2”,
"01:45            ",
“随机文本3”,
"02:10            ",
“标题2 00:05:20”,
“随机文本4”,
"07:25            ",
“随机文本5”,
"04:35            ",
“随机文本6”,
"09:12            "
};
常量字符串HEADINGSTART=“heading”//TODO:设置正确的值
var temp=Enumerable.Range(0,data.Count-1)//基于索引进行迭代
.Where(i=>data[i].StartsWith(HEADINGSTART))//查找标题
.选择(i=>new{//Project to 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
航向=d.航向,
数据=d2
}))
.ToList();
var result=Enumerable.Range(0,temp.Count/2)//再次根据索引进行迭代
.Select(i=>new{//Project到请求的对象
名称=温度[i*2]。数据,
类别=临时[i*2]。标题,
持续时间=温度[i*2+1]。数据
})
.ToList();

一个标题中是否总是有3个随机文本?或者它是一个灵活的数量?嘿,Maarten,它是一个灵活的随机文本数量,就像它是标题一样。我如何识别一行是标题还是随机文本?嗯,对于我的实际代码,我一直在使用正则表达式。在这种情况下,我不知道。但是我们可以想象我在处理列表之前编辑它,这样标题行就有一些特殊的字符或开始字符串来表示它是标题行。我假设对于每个随机文本,下一行也有相应的持续时间。