C# - LINQ - Sortieren und gruppieren ein Dictionary<string,DateTime> nach Datum und mit maximale Größe der Gruppe

Ich bin auf der Suche, um erstellt Chargen von einem Dictionary<string, DateTime> mit den folgenden Einschränkungen:

  1. Alle Elemente im batch-viel teilen das gleiche Datum
  2. Es kann nicht mehr als X Elemente in einem einzigen batch. Wenn es mehrere Elemente mit dem gleichen Datum, eine batch erstellt werden muss.

Bin, habe ich mir folgende Logik, aber Frage mich, ob es einigen anderen mehr prägnanten Art und Weise, dies zu tun, nur mit linq.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dictionary_sort_by_value_test
{
    class Program
    {
        static void Main(string[] args)
        {
            int maxBatchSize = 3;

            Dictionary<string, DateTime> secs = new Dictionary<string, DateTime>();
            secs.Add("6571 JT", new DateTime(2011, 1, 10));
            secs.Add("6572 JT", new DateTime(2011, 1, 12));
            secs.Add("6573 JT", new DateTime(2011, 1, 12));
            secs.Add("6574 JT", new DateTime(2011, 1, 12));
            secs.Add("6575 JT", new DateTime(2011, 1, 10));
            secs.Add("6576 JT", new DateTime(2011, 1, 11));
            secs.Add("6577 JT", new DateTime(2011, 1, 11));
            secs.Add("6578 JT", new DateTime(2011, 1, 11));
            secs.Add("6579 JT", new DateTime(2011, 1, 11));

            var sorted = secs.OrderBy(o => o.Value).GroupBy(o => o.Value);

            foreach (var date in sorted)
            {    
                Console.Write("\nNew batch at {0} \n", date.Key);
                int batchsize = 0;
                foreach (var sec in date)
                {
                    if (batchsize < maxBatchSize)
                    {
                        Console.Write("  {0} {1} \n", sec.Key, sec.Value);
                        batchsize++;
                    }
                    else
                    {
                        Console.Write("\nNew batch at {0} \n", date.Key);
                        Console.Write("  {0} {1} \n", sec.Key, sec.Value);
                        batchsize = 1;
                    }
                }
            }
        }
    }
}
Ich sehe nicht, wo/wie du bist erstellen eine neue Ladung in Ihrem code. Sie sind das zählen der Anzahl der batches, die aber nicht jedem anlegen einer neuen charge und hinzufügen, um Ihre "Ergebnis". Ich persönlich der einzige Weg, Sie könnte dies nur mithilfe von LINQ wäre, noch ein tie-breaker, so können Sie die Gruppe, indem Sie diese als gut. Oder implementieren Sie Ihre Logik als Extension method auf IEnumerable<T>. So, es schauen, wie LINQ, fühlen Sie sich wie LINQ und es wird LINQ denn das ist, wie LINQ implementiert ist, sowieso.

InformationsquelleAutor Andre P. | 2011-02-23

Schreibe einen Kommentar