前段时间我问了一个问题 - > how to count conditioned continuous values in a list with linq?
@Fung回答了这个问题。但是,我改变了一些问题的规则。新条件:
var query = Enumerable.Range(0, 1440).Select((n, index) =>
{
if ((index >= 480 && index <= 749) || (index >= 810 && index <= 999) || (index >= 1080 && index <= 1099) || (index>=1200 && index <= 1299))
return 0;
else if ((index >= 750 && index <= 809) || (index >= 1100 && index <= 1199))
return 1;
else
return 2;
});
那么,我能找到多少索引连续有“0”值,哪些是它们的索引 - 即使中断为“1”(不是2) - ?例如;
query[480]=query[481]=query[482]....query[749] = 0,
query[750]=query[751]...query[809] = 1,
query[810]=query[811]....query[999] = 0,
query[1000]?query[1001]...query[1079] = 2,
query[1080]=query[1081]....query[1099] = 0,
query[1100]=query[1101]....query[1199] = 1,
query[1200]=query[1201]....query[1299] = 0, etc..
所以,答案是270(在1之前)+ 190(在1之后)= 460 虽然1080和1099之间的索引为0,但不应考虑它们,因为先前的值为“2”。
此外,应考虑1080到1099和1200到1299之间的值,因为它们还有新的0 - 1 - 0系列。而且,这个系列应该被列入另一个名单。有没有办法实现这个目标?
我现在有这些结果:
但是,由于它除以“2”,我希望它们在另一个列表中:
答案 0 :(得分:1)
public class ListStuff
{
public int Count { get; set; }
public int Start { get; set; }
public int End { get; set; }
public int LType { get; set; }
public int Group { get; set; }
}
var query = Enumerable.Range(0, 1440).Select((n, index) =>
{
if ((index >= 480 && index <= 749) || (index >= 810 && index <= 999) || (index >= 1080 && index <= 1099) || (index >= 1200 && index <= 1299))
return 0;
else if ((index >= 750 && index <= 809) || (index >= 1100 && index <= 1199))
return 1;
else
return 2;
});
int typeCount = 0;
int groupCount = 0;
var result = query
.Select((x, i) => new
{
Value = x,
Index = i,
Group = (((i == 0 || (query.ElementAt(i - 1) == 2)) && x != 2) ? ++groupCount : groupCount)
})
.GroupBy(x =>
x.Index == 0 || x.Value != query.ElementAt(x.Index - 1)
? ++typeCount
: typeCount)
.Select(x => new ListStuff()
{
Count = x.Count(),
Start = x.First().Index,
End = x.Last().Index,
LType = x.First().Value,
Group = x.First().Group
})
.Where(x => x.LType == 0 || x.LType == 1)
.GroupBy(x => x.Group)
.ToList();