基于规则的数据分组LINQ

时间:2017-01-11 14:18:16

标签: c# linq grouping

我需要根据一些预设规则将数据分组。我输入数据的间隔为5分钟,有时超过5分钟。 我需要把它们分成几段进行进一步处理,但由于某些原因它对我不起作用。

数据示例:

var grouped = dataList.GroupBy(tv => /*group when is dataList[i]-dataList[i-1]==5 */)
                .Select(g => g.OrderBy(tv => tv.dateTime).ToList()
                ).ToList();

以下是示例代码:http://rextester.com/GQW59118

示例中应该有两个部分。

我需要这样的东西

{{1}}

任何人都可以提出建议吗? (如果没有循环)

1 个答案:

答案 0 :(得分:0)

试试这个:

public class Program
{
    public static void Main(string[] args)
    {
         List<TimeValue> ttcaList = new List<TimeValue>();

        Random s = new Random();
        DateTimeOffset dto = DateTimeOffset.Now;  


        for (int i = 0; i < 6; i++)
        {
            ttcaList.Add(new TimeValue(dto.AddMinutes(i*5), s.Next(0, 20)));
        }
        for (int i = 0; i < 5; i++)
        {
            ttcaList.Add(new TimeValue(dto.AddMinutes(10*5).AddMinutes(i*5), s.Next(0, 20)));
        }


        foreach (var item in ttcaList)
        {
            Console.WriteLine(item.Time+"   value "+ item.Value);
        }

        List<List<TimeValue>> grouped = new List<List<TimeValue>>();

        var interval = 5;
        DateTimeOffset lastTime = new DateTimeOffset();

        foreach (var item in ttcaList)
        {

            if (grouped.Count == 0) 
            {
                grouped.Add(new List<TimeValue>() {item});
                lastTime = item.Time;
            }
            else 
            {
                if ((item.Time - lastTime).TotalMinutes <= interval)
                    grouped.Last().Add(item);
                else 
                    grouped.Add(new List<TimeValue>() {item});

                lastTime = item.Time;
            }
        }

        Console.WriteLine("\n\n grouped data");

        foreach (var skup in grouped)
        {
            Console.WriteLine("\t\t group");
        foreach (var item in skup)
        {

            Console.WriteLine(item.Time+"   value "+ item.Value);
         }
        }
    }

您有5分钟的时间间隔,您可以通过更改interval

的值来更改它