如何使用linq计算列表中的条件连续值? (Revized)

时间:2014-05-16 06:03:14

标签: c# linq list indexing

前段时间我问了一个问题 - > 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系列。而且,这个系列应该被列入另一个名单。有没有办法实现这个目标?

我现在有这些结果: enter image description here

但是,由于它除以“2”,我希望它们在另一个列表中:enter image description here

1 个答案:

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