2017-11-15 10 views
1

私はオーナー、町、 "タイムアウト"のリストでグループ化する必要があります。 「タイムアウト」について説明します。Linq Groupby Elapsed Time

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

リストがあります。 リストを作成したいところですが、各サブリストには、created_timeが10秒未満のチケットのリストが含まれています。ここで

はチケットのサンプルリストです:

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

私は夢中になっています。

+1

時間差分を開催します#3パット・ジェリーと#6パット・ジェリーは8秒ですが、あなたはそれを分けました。それが正しいか? –

+0

10秒というのはどういう意味ですか?それは10秒単位ですか、それともすべての要素が10秒以内ですか? –

+0

@ sarslanはい、タイムアウトになったからです! > 10秒と私たちは別のサブリストでそれを取得する必要があります –

答えて

0

、ここに私の実装はご参考としてある

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>(); 
    } 
} 

結果変数は `の間にあなたの期待出力

+0

あなたは男です!あなたの良い答えをありがとうございました。 –

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; } 
} 

出力は次のようになります。

Key= 11/15/2017 11:33:20 AM 
pk owner reffering created_time 
1 John Sam 11/15/2017 11:33:20 AM 
2 John Sam 11/15/2017 11:33:21 AM 
3 Pat Jerry 11/15/2017 11:33:27 AM 
4 John Sam 11/15/2017 11:33:28 AM  

Key= 11/15/2017 11:33:30 AM 
pk owner reffering created_time 
6 Pat Jerry 11/15/2017 11:33:35 AM 

Key= 11/15/2017 11:34:00 AM 
pk owner reffering created_time 
5 John Sam 11/15/2017 11:34:00 AM 

あなたはダイナミックバケットで10秒のグループによる動的動的グループチケットをしたい場合は、あなたのデータの最良のパーティションを見つけるためにいくつかのクラスタリングアルゴリズムを必要とする必要があります。私はあなたがLINQでこれのすべてを行うことができ、非常にわからない

+0

あなたの出力は、OPが期待していたものではありません –