如何仅使用LINQ从列表中选择不同长度的节
本文关键字:选择 何仅使 LINQ 列表 | 更新日期: 2023-09-27 18:19:34
我有一个名为"Complex"的类型列表:
List<Complex> list = new List<Complex>();
...
class Complex
{
public string Header { get; set; }
...
...
...
}
列表中有一些重复的标题,这些标题表示新部分的开始。每个部分的长度可能不同,如下所示:
start 1 2 3 4 5 6 7 start 1 2 3 start 1 2 3 4 5 6 start 1 start 1 2
我想使用LINQ获得复杂类型的所有可能的子列表;即,所有具有标头的对象,如下所示:
- 1 2 3 4 5 6 7
- 1 2 3
- 1 2 3 4 5 6
- 1
- 1 2
如何仅使用LINQ实现此功能?
编辑:列表是在html页面解析期间创建的
<tr>
<td>00:00<!--//-00:00--></td>
<td>15:00<!--//-00:00--></td>
<td class="txt_left"><a href="">News</a></td>
<td><a href="/TsV2/TV_Video_On.asp?PROG_CODE=TVCR0114">
<img src="/images/new/sub_new/icon_play01_off.gif" alt="play" class="rollover"/></a></td>
</tr>
<tr>
<td>00:15<!--//-00:00--></td>
<td>15:15<!--//-00:00--></td>
<td class="txt_left">
<a href="Tv_Pagego.asp?PROG_CODE=TVCR0556">Nice one</a></td>
<td><a href="/TV2w/TV_2Video_On.asp?PROG_CODE=TVCR0556"><img src="/images/new/sub_new/icon_play01_off.gif" alt="play" class="rollover"/></a></td>
</tr>
static void Main(string[] args)
{
var seq = new object[] {"start", 1, 2, 3, 4, "start", 1, 2, 3, "start", 1, 2, "start", 1};
var no = 0;
var test = (from i in seq select new {SeqNo = (i.ToString() == "start" ? no++ : no), Item = i}).Where( x => x.Item.ToString() != "start").GroupBy( y => y.SeqNo ).Select( z => z.ToArray()).ToArray();
}
或
var test = (from i in seq
group i by i.ToString() == "start" ? ++no : no into g
select g.Where( gi => gi.ToString() != "start" ).ToArray()
).ToArray()
;
ToArray语句不是必需的
这个问题我不清楚,但这里有一些提示:
- 使用.Distinct()获得唯一的结果
- 尝试GroupBy(c=>c.Header)
- 使用字符串。如有必要,拆分以拆分字符串值
var List = new List<Complex>()
{
new Complex() { Header = "start" },
new Complex() { Header = "00:23" },
new Complex() { Header = "00:33" },
new Complex() { Header = "start" }
};
var query = List.GroupBy(x => x.Header);
这将导致3个IGrouping,一个标题为"Start",一个为"00:23",另一个则为"00:33"
更具体地说,查询将返回一个IEnumerable>,其中Keys将是您的标头。元素将是你的类型(复杂)。
编辑:不是问什么问题,但这似乎是:)
var seq = new object[] {"start", 1, 2, 3, 4, "start", 1, 2, 3, "start", 1, 2, "start", 1}.ToList();
while(seq.Count() != 0)
{
var Output = seq.SkipWhile(x => x.ToString() != "start").Skip(1).TakeWhile(x => x.ToString() != "start");
seq.RemoveRange(0, Output.Count() +1);
}
我喜欢它…