7

私は次のモデルを持っています:

public class Entry
{
    public int UseraccountId { get; set; }
    public int CompanyId { get; set; }
    public DateTime CreationDate { get; set; }
    public string Target { get; set; }
    public string Message { get; set; }
}

そして、多くのエントリを含むリスト:

List<Entry> entries = ... //get all entries.

例:

グループ化前の例

行 2 と行 3 をグループ化したいと思います。なぜなら、それらは同じ UserId、同じ CompanyId、同じターゲット、そしてほとんど(そしてこれは難しい部分です) を持っているからです。

グループ化すると、リストは次のようになります。

ここに画像の説明を入力

この問題に対する簡単なアプローチはありますか? 何かアドバイスはありますか?Linq が私を助けてくれるに違いありませんが、どうすればよいかわかりません。

編集: フィードバックをお寄せいただきありがとうございます。デザインを変更し、日時が実際に同じになるようにすることにしました。そのため、linq を使用したグループ化は非常に簡単になりました。

4

3 に答える 3

1

@dtb メニトンのように、意図したよりも大きな「バケツ」になる可能性があるため、「閉じる」によるグループ化は困難です。たとえば、互いに 4 秒間隔で作成された 100 個のエントリがある場合、「次の」アイテムから 5 秒以内にあるアイテムをグループ化すると、それらすべてが 1 つのバケットに入れられます。

ただし、作成日を最も近い、たとえば 5 秒に丸めてからグループ化したい場合は、次のように使用できます。

TimeSpan ts = new TimeSpan(0, 0, 5);  // 5 seconds
entries.GroupBy(i => new {
                          UserId = i.UserId, 
                          CompanyId = i.CompanyId, 
                          Target = i.Target, 
                          RoundedTime = DateTime.MinValue.AddTicks(
                                            (long)(Math.Round((decimal)i.CreationDate.Ticks / ts.Ticks) * ts.Ticks)
                                        ) ;
                          ))
       .Select(g => new {
                         UserId = g.Key.UserId, 
                         CompanyId = g.Key.CompanyId, 
                         Target = g.Key.Target, 
                         RoundedTime = g.Key.RoundedTime,
                         Message = string.Join(", ",g.Select(i=> i.Message).ToArray())
                        } );

これは、最も近い 5 秒に丸められたアイテムでグループ化されます。1 秒離れた 2 つのアイテムが異なるバケットにある可能性がありますが、指定された要件にある累積性の問題はありません。

于 2013-04-24T16:02:35.667 に答える