Wie Sie die Gruppe Termine in der Woche?
Schreibe ich eine Excel-exporter für eine maßgeschneiderte Anwendung, die ich erschaffe, und ich habe eine Frage zu LINQ-Gruppierung in C#.
Grundsätzlich, diese neue Excel-exporter-Klasse erhält zwei Termine. Die Klasse ruft dann alle Sendungen, die zwischen diesem Datum-Bereich.
Als Teil dieser Ausführer, ich muss in der Lage sein, um die Gruppierung der Daten in Wochen, und erhalten die Werte für diese Woche. So zum Beispiel, wenn ich 07/12/2011 und 22/12/2011 (TT/MM/JJJJ-format), die ich brauche, um die Gruppierung aller Sendungen, die zwischen Ihnen reicht in Wochen (jede Woche, beginnend mit Sonntag). Das ideale Ergebnis bei Verwendung der oben genannten Termine wäre
Week 1: (consignments between 04/12/2011 and 10/12/2011)
Week 2: (consignments between 11/12/2011 and 17/12/2011)
Week 3: (consignments between 18/11/2011 and 24/12/2011)
Irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die grundlegende Frage hier ist, wie man ein Projekt
DateTime
- Instanz in eine Woche im Jahr Wert. Dies kann durchgeführt werden, indem durch AufrufKalender.GetWeekOfYear
. So definieren Sie die Projektion:Können Sie konfigurieren, genau, wie die "Nummer der Woche" ist bestimmt durch anpassen der Parameter in der aufgerufenen Methode. Sie können auch entscheiden, definieren Sie die Projektion, wie z.B. eine Erweiterung Methode, wenn Sie bevorzugen, ändert dies nicht das Wesen der code. In jedem Fall sind Sie dann bereit, um die Gruppe durch die Woche:
Wenn Sie wollen auch zum begrenzen der Ausgabe auf consigments zwischen zwei bestimmten Datumsangaben, fügen Sie einfach eine entsprechende
where
- Klausel; die Gruppierung der Logik nicht ändern.Zögerlich, obwohl ich bin nicht einverstanden mit geschätzten ein Beantworter der Frage ich glaube die akzeptierte Antwort hier ist falsch, und dies ist nicht grundsätzlich eine Frage der Projektion, um eine Woche im Jahr Wert.
GetWeekOfYear(), und das Konzept im Allgemeinen, ist über die Zuordnung der index-Werte zu Wochen innerhalb eines Jahres nach einem vereinbarten standard. Es ist nicht geeignet für die Platzierung von Daten in Gruppen von benachbarten sieben Tagen, wie ich glaube, der Fragesteller benötigt.
Nicht nur die Verwendung von GetWeekOfYear() wie vorgeschlagen als Ergebnis in Gruppen von weniger als sieben Tagen auf das Ende von vielen Jahren, aber schlimmer noch, wie die verschiedenen standards unterstützt GetWeekOfYear() wird oft austeilst den ersten Tagen des Jahres zur letzten Kalenderwoche des vorherigen Jahres, und doch ist die GetWeekOfYear ( - ) Ergebnis enthält nur die integer-Woche-index mit keine Referenz zu verbundenen Jahr, Gruppierung von
new { Year = date.Year, weekProjector(date) }
oderdate.Year + "-" + weekProjector(date)
im Fragesteller die Jahr sehen würde 1. Januar 2011 zusammengefasst und mit Weihnachten bis zu Silvester zwölf Monate später im selben Jahr.Also ich würde behaupten, dass die ursprüngliche Frage ist grundsätzlich eine Projektion nicht, um eine Woche im Jahr Wert, aber zu einem Woche Zeit Wert, "Woche, Anfang y/m/d" könnte man sagen, so die Gruppierung muss nur getan werden, indem der erste Tag der Woche, d.h. (angenommen, Sie sind glücklich, Standard bis Sonntag) einfach:
group by date.AddDays(((int)date.DayOfWeek) < 4 ? (-(int)date.DayOfWeek) : (-(int)date.DayOfWeek + 7))
Neben
Jon's
Antwort, die Sie bekommen können das Datum des ersten Tages in der Woche dann die Gruppe nach diesem Datum.Erhalten Sie das Datum des ersten Tag der Woche.
Sie können diesen code verwenden:
dann können Sie die Gruppe durch das erste Datum der Woche so: