C# Linq Groupby运行时间

C# Linq Groupby运行时间,c#,linq,time,linq-group,C#,Linq,Time,Linq Group,我需要按所有者、城镇和“超时”列表分组。 我将解释“超时”: 我有一张单子。 我想创建一个列表>,其中每个子列表包含一个创建时间小于10秒的票证列表 void Main() { var ticketsList = new List<Ticket>(); ticketsList.Add(new Ticket { pk = 1, owner="John", reffering="Sam" , created_time = new DateTime(2017, 11, 1

我需要按所有者、城镇和“超时”列表分组。 我将解释“超时”:

我有一张单子。 我想创建一个列表>,其中每个子列表包含一个创建时间小于10秒的票证列表

void Main()
{
    var ticketsList = new List<Ticket>();
    ticketsList.Add(new Ticket { pk = 1, owner="John", reffering="Sam"  , created_time = new DateTime(2017, 11, 15, 11, 33, 20) });
    ticketsList.Add(new Ticket { pk = 2, owner="John", reffering="Sam"  , created_time = new DateTime(2017, 11, 15, 11, 33, 21) });
    ticketsList.Add(new Ticket { pk = 3, owner="Pat" , reffering="Jerry", created_time = new DateTime(2017, 11, 15, 11, 33, 27) });
    ticketsList.Add(new Ticket { pk = 4, owner="John", reffering="Sam"  , created_time = new DateTime(2017, 11, 15, 11, 33, 28) });
    ticketsList.Add(new Ticket { pk = 6, owner="Pat" , reffering="Jerry", created_time = new DateTime(2017, 11, 15, 11, 33, 35) });
    ticketsList.Add(new Ticket { pk = 5, owner="John", reffering="Sam"  , created_time = new DateTime(2017, 11, 15, 11, 34, 00) });

    var now = DateTime.Now;


    var orderedList = ticketsList.OrderBy(p => p.created_time).GroupBy(p => new { p.owner, p.reffering }).Select(g => g.ToList());

    // Here is the 10 seconds grouping. I'm basically creating a new date 
    // starting at the beginning of a 10 seconds interval. I will then 
    // use this new date to perform the grouping.
    var normalizedGroupKeysList = ticketsList.Select(t => new { ticket = t, groupKey = t.created_time.HasValue ? t.created_time.Value.AddSeconds(-t.created_time.Value.Second % 10) : now });

    var result = normalizedGroupKeysList.GroupBy(t => t.groupKey, t => t.ticket);
}

public class Ticket
{
    public int pk { get; set; }
    public string owner { get; set; }
    public string reffering { get; set; }

    public DateTime? created_time { get; set; }
}
以下是一份门票示例列表:

pk   owner   reffering   created_time
#1   John    Sam         15/11/2017 11:33:20
#2   John    Sam         15/11/2017 11:33:21
#3   Pat     Jerry       15/11/2017 11:33:27
#4   John    Sam         15/11/2017 11:33:28
#6   Pat     Jerry       15/11/2017 11:33:35
#5   John    Sam         15/11/2017 11:34:00
我需要一份清单,上面有

   pk   owner   reffering   created_time
---#1 Sub List ---
    #1   John    Sam         15/11/2017 11:33:20
    #2   John    Sam         15/11/2017 11:33:21
    #4   John    Sam         15/11/2017 11:33:28
---#2 Sub List ---
    #5   John    Sam         15/11/2017 11:34:00
---#3 Sub List ---
    #3   Pat     Jerry       15/11/2017 11:33:27
    #6   Pat     Jerry       15/11/2017 11:33:35
这是我的开始代码,但我可以找到如何做到这一点

List<List<Ticket>> result = tickets.OrderBy(p => p.created_time).GroupBy(p => new { p.owner, p.reffering }).Select(g => g.ToList()).ToList();
List result=tickets.OrderBy(p=>p.created_time).GroupBy(p=>new{p.owner,p.reffering}).选择(g=>g.ToList()).ToList();

希望有人能帮上忙,尤其是在时间流逝的时候。。这让我发疯

这里有一些东西可以帮助你。 它通过10秒的固定存储桶对条目进行分组

void Main()
{
    var ticketsList = new List<Ticket>();
    ticketsList.Add(new Ticket { pk = 1, owner="John", reffering="Sam"  , created_time = new DateTime(2017, 11, 15, 11, 33, 20) });
    ticketsList.Add(new Ticket { pk = 2, owner="John", reffering="Sam"  , created_time = new DateTime(2017, 11, 15, 11, 33, 21) });
    ticketsList.Add(new Ticket { pk = 3, owner="Pat" , reffering="Jerry", created_time = new DateTime(2017, 11, 15, 11, 33, 27) });
    ticketsList.Add(new Ticket { pk = 4, owner="John", reffering="Sam"  , created_time = new DateTime(2017, 11, 15, 11, 33, 28) });
    ticketsList.Add(new Ticket { pk = 6, owner="Pat" , reffering="Jerry", created_time = new DateTime(2017, 11, 15, 11, 33, 35) });
    ticketsList.Add(new Ticket { pk = 5, owner="John", reffering="Sam"  , created_time = new DateTime(2017, 11, 15, 11, 34, 00) });

    var now = DateTime.Now;


    var orderedList = ticketsList.OrderBy(p => p.created_time).GroupBy(p => new { p.owner, p.reffering }).Select(g => g.ToList());

    // Here is the 10 seconds grouping. I'm basically creating a new date 
    // starting at the beginning of a 10 seconds interval. I will then 
    // use this new date to perform the grouping.
    var normalizedGroupKeysList = ticketsList.Select(t => new { ticket = t, groupKey = t.created_time.HasValue ? t.created_time.Value.AddSeconds(-t.created_time.Value.Second % 10) : now });

    var result = normalizedGroupKeysList.GroupBy(t => t.groupKey, t => t.ticket);
}

public class Ticket
{
    public int pk { get; set; }
    public string owner { get; set; }
    public string reffering { get; set; }

    public DateTime? created_time { get; set; }
}

如果您想在动态存储桶中以10秒为一组对票据进行动态分组,您应该需要一些群集算法来找到数据的最佳分区。

我不太确定您是否可以使用LINQ完成所有这些操作,以下是我的实现作为您的参考

var ticketGroups = tickets.OrderBy(x => x.created_time)
                            .GroupBy(x => new { x.owner, x.reffering });
var tensecondTimespam = new TimeSpan(0, 0, 10);
var results = new List<List<Ticket>>();
var ticketTemps = new List<Ticket>();

foreach (var ticketGroup in ticketGroups)
{
    foreach (var ticket in ticketGroup)
    {
        var currentTicket = ticketTemps.LastOrDefault();
        var isWithinTimeRange = currentTicket == null
                                || ticket.created_time.Value - currentTicket.created_time.Value <= tensecondTimespam;

        if (!isWithinTimeRange)
        {
            results.Add(ticketTemps);
            ticketTemps = new List<Ticket>();
        }
        ticketTemps.Add(ticket);
    }
    if (ticketTemps.Any())
    {
        results.Add(ticketTemps);
        ticketTemps = new List<Ticket>();
    }
}
var ticketGroups=tickets.OrderBy(x=>x.created\u time)
.GroupBy(x=>new{x.owner,x.reffering});
var tensecondTimespam=新的时间跨度(0,0,10);
var results=新列表();
var ticketTemps=新列表();
foreach(ticketGroup中的var ticketGroup)
{
foreach(ticketGroup中的var票证)
{
var currentTicket=ticketTemps.LastOrDefault();
变量isWithinTimeRange=currentTicket==null

||ticket.created_time.Value-currentTicket.created_time.Value
#3 Pat Jerry
#6 Pat Jerry
之间的时间差是8秒,但您已将其分开。是否正确?10秒是什么意思?是10秒块还是所有元素之间的间隔都在10秒以内?@sarslan是的,因为超时时间已超过10秒,我们必须这样做把它放在不同的潜艇里list@FilipCordas我想按所有者和城镇对元素进行分组,然后对创建票证的时间少于10秒的元素进行分组。@karim哪一个是基准时间。第一行还是前一行?您的输出不是OP所期望的
var ticketGroups = tickets.OrderBy(x => x.created_time)
                            .GroupBy(x => new { x.owner, x.reffering });
var tensecondTimespam = new TimeSpan(0, 0, 10);
var results = new List<List<Ticket>>();
var ticketTemps = new List<Ticket>();

foreach (var ticketGroup in ticketGroups)
{
    foreach (var ticket in ticketGroup)
    {
        var currentTicket = ticketTemps.LastOrDefault();
        var isWithinTimeRange = currentTicket == null
                                || ticket.created_time.Value - currentTicket.created_time.Value <= tensecondTimespam;

        if (!isWithinTimeRange)
        {
            results.Add(ticketTemps);
            ticketTemps = new List<Ticket>();
        }
        ticketTemps.Add(ticket);
    }
    if (ticketTemps.Any())
    {
        results.Add(ticketTemps);
        ticketTemps = new List<Ticket>();
    }
}