代码之家  ›  专栏  ›  技术社区  ›  Eric Bergman

按特定范围内的日期分组

  •  3
  • Eric Bergman  · 技术社区  · 6 年前

    假设我有以下项目和日期的内存集合:

    ItemID: 1, Date: 10/10/2018 11:30 AM
    ItemID: 1, Date: 10/10/2018 11:32 AM
    ItemID: 1, Date: 10/10/2018 11:33 AM
    ItemID: 1, Date: 10/10/2018 11:34 AM
    ItemID: 1, Date: 10/10/2018 11:57 AM
    ItemID: 2, Date: 10/10/2018 7:45 AM
    ItemID: 2, Date: 10/10/2018 7:49 AM
    ItemID: 3, Date: 10/10/2018 8:45 AM
    ItemID: 3, Date: 10/10/2018 9:13 AM
    

    5分钟 对于最低日期,在本例中,第1项的最低时间是:11:30 AM,因此按以下11:30+5分钟之间的任何时间分组

    在上面的数据集中,以下数据将被分组

    ItemID: 1, Date: 10/10/2018 11:30 AM    <-- Grouped with Item 1
    ItemID: 1, Date: 10/10/2018 11:32 AM    <-- Grouped with Item 1
    ItemID: 1, Date: 10/10/2018 11:33 AM    <-- Grouped with Item 1
    ItemID: 1, Date: 10/10/2018 11:34 AM    <-- Grouped with Item 1
    
    
    ItemID: 1, Date: 10/10/2018 11:57 AM    <-- Not Grouped
    
    
    ItemID: 2, Date: 10/10/2018 7:45 AM    <-- Grouped with Item 2
    ItemID: 2, Date: 10/10/2018 7:49 AM    <-- Grouped with Item 2
    
    
    ItemID: 3, Date: 10/10/2018 8:45 AM    <-- Not Grouped
    
    ItemID: 3, Date: 10/10/2018 9:13 AM    <-- Not Grouped
    

    分组的是相隔5分钟内的。

    输出:

    Item 1:
    Date: 10/10/2018 11:30 AM    <--- Lowest Minute is 30 so 30 + 5 range group
    Date: 10/10/2018 11:32 AM
    Date: 10/10/2018 11:33 AM
    Date: 10/10/2018 11:34 AM
    
    Item 1:
    Date: 10/10/2018 11:57 AM
    
    Item 2:
    Date: 10/10/2018 7:45 AM
    Date: 10/10/2018 7:49 AM
    
    Item 3:
    Date: 10/10/2018 8:45 AM
    
    Item 3:
    Date: 10/10/2018 9:13 AM
    
    3 回复  |  直到 6 年前
        1
  •  5
  •   arekzyla    6 年前

    var interval = 5;
    var groupedItems = items
        .GroupBy(i => i.ItemId, (k, g) => g
            .GroupBy(i => (long)(i.Date - g.Min(e => e.Date)).TotalMinutes / interval))
        .SelectMany(g => g);
    
        2
  •  2
  •   Cory    6 年前

    这里有一个非常粗糙的例子,我放在一起得到你想要的“输出”。当然,将它应用于您的情况,并添加您自己的错误检查/验证/排序等。我也没有使用LINQ,因为我觉得它不合适 per your comment

    支持类:

    class Item
    {
        public int ItemID { get; set; }
        public DateTime Date { get; set; }
    }
    

    示例方法:

    private static void Example()
    {
        var myList = new List<Item>
        {
            new Item {ItemID = 1, Date = DateTime.Parse("10/10/2018 11:30 AM") },
            new Item {ItemID = 1, Date = DateTime.Parse("10/10/2018 11:32 AM") },
            new Item {ItemID = 1, Date = DateTime.Parse("10/10/2018 11:33 AM") },
            new Item {ItemID = 1, Date = DateTime.Parse("10/10/2018 11:34 AM") },
            new Item {ItemID = 1, Date = DateTime.Parse("10/10/2018 11:57 AM") },
            new Item {ItemID = 2, Date = DateTime.Parse("10/10/2018 7:45 AM") },
            new Item {ItemID = 2, Date = DateTime.Parse("10/10/2018 7:49 AM") },
            new Item {ItemID = 3, Date = DateTime.Parse("10/10/2018 8:45 AM") },
            new Item {ItemID = 3, Date = DateTime.Parse("10/10/2018 9:13 AM") }
        };
    
        Item baseItem = myList.First();
        int currentGroup = 1;
    
        // output first group
        Console.WriteLine($"Group {currentGroup}");
    
        foreach (var item in myList) // .OrderBy(i=>i.ItemID).ThenBy(i => i.Date))
        {
            // if item is different OR date is >5mins from the first
            if (item.ItemID != baseItem.ItemID || item.Date > baseItem.Date.AddMinutes(5))
            {
                // different group
                currentGroup += 1;
    
                // set new base item
                baseItem = item;
    
                Console.WriteLine($"\nGroup {currentGroup}");// output new group
            }
    
            // output the item
            Console.WriteLine($"Item {item.ItemID}. Date: {item.Date}");
        }
    }
    

    输出:

    Group 1
    Item 1. Date: 10/10/2018 11:30:00 AM
    Item 1. Date: 10/10/2018 11:32:00 AM
    Item 1. Date: 10/10/2018 11:33:00 AM
    Item 1. Date: 10/10/2018 11:34:00 AM
    
    Group 2
    Item 1. Date: 10/10/2018 11:57:00 AM
    
    Group 3
    Item 2. Date: 10/10/2018 7:45:00 AM
    Item 2. Date: 10/10/2018 7:49:00 AM
    
    Group 4
    Item 3. Date: 10/10/2018 8:45:00 AM
    
    Group 5
    Item 3. Date: 10/10/2018 9:13:00 AM
    
        3
  •  2
  •   Hadou    6 年前

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace ConsoleApp3
    {
        public class Item
        {
            public int ItemID { get; set; }
            public DateTime Date { get; set; }
        }
        class Program
        {
            static void Main(string[] args)
            {
                List<Item> items = new List<Item>
                {
                    new Item { ItemID= 1, Date = new DateTime(2018, 10, 10, 11, 30, 0) },
                    new Item { ItemID= 1, Date = new DateTime(2018, 10, 10, 11, 32, 0) },
                    new Item { ItemID= 1, Date = new DateTime(2018, 10, 10, 11, 33, 0) },
                    new Item { ItemID= 1, Date = new DateTime(2018, 10, 10, 11, 34, 0) },
                    new Item { ItemID= 1, Date = new DateTime(2018, 10, 10, 11, 57, 0) },
                    new Item { ItemID= 2, Date = new DateTime(2018, 10, 10, 7, 45, 0) },
                    new Item { ItemID= 2, Date = new DateTime(2018, 10, 10, 7, 49, 0) },
                    new Item { ItemID= 2, Date = new DateTime(2018, 10, 10, 8, 45, 0) },
                    new Item { ItemID= 2, Date = new DateTime(2018, 10, 10, 9, 13, 0) }
                };
    
                var groupedItems = items.GroupBy(i => i.ItemID, (k, g) => g
              .GroupBy(i => (long)new TimeSpan(i.Date.Ticks - g.Min(e => e.Date).Ticks).TotalMinutes / 5));
    
                var groupIndex = 0;
                foreach (var group in groupedItems)
                {
                    foreach (IGrouping<long, Item> groupItem in group)
                    {
                        Console.Out.WriteLine("Group " + (++groupIndex));
    
                        foreach (var item in groupItem)
                        {
                            Console.WriteLine($"Item {item.ItemID}. Date: {item.Date}");
    
                        }
                        Console.Out.WriteLine();
                    }
                }
                Console.ReadLine();
            }
        }
    }
    

    干杯