J'ai une liste contenant des dates: à l'aide de C # Quel est le moyen le meilleur / le plus court pour trouver la date de la date / maximum de cette liste? P> P> P> >
6 Réponses :
via Linq, vous pouvez faire:
from row in StringDates group row by true into r select new { min = r.Min(z => z), max = r.Max(z => z) }
La liste est une liste
Utilisez LINQ!:
var list = new List<DateTime>(); list.Add(new DateTime(2010, 1, 1)); list.Add(new DateTime(2008, 1, 1)); list.Add(new DateTime(2009, 1, 1)); Console.WriteLine(list.Max(date => date)); Console.WriteLine(list.Min(date => date));
Convertissez-les en DateTime code> à l'aide de parseexact (ou trypseexact), puis utilisez LINQ pour obtenir le min et max:
List<DateTime> dates = StringDates
.Select(x => DateTime.ParseExact(x, "dd.MM.yyyy", null))
.ToList();
DateTime minDate = dates.Min();
DateTime maxDate = dates.Max();
J'aime la solution simple.
DateTime minDate = DateTime.MaxValue; DateTime maxDate = DateTime.MinValue; foreach (string dateString in StringDates) { DateTime date = DateTime.Parse(dateString); if (date < minDate) minDate = date; if (date > maxDate) maxDate = date; }
J'ai effectivement commencé à écrire la même méthode, je ne pense pas que beaucoup pourrait être faite pour battre O (n) code> si vous ne le mettez pas dans un type de structure de tas qui vous permettrait de le résoudre dans
O (logn) CODE> TIME, mais vous échangeriez des cycles de processeur qui sont incroyablement bon marché pour le double stockage de mémoire qui est moins bon marché comparativement.
@Jeffrey: Faites attention à la mondialisation du format DateTime pour les dates représentées comme chaînes!
@ Tommieb75 - Oui, j'ai pensé à cela, mais je ne l'ai pas inclus, parce que j'étais paresseux. Cette partie peut être prise de la réponse de Mark Byers. Je vais lui donner upvote pour la pièce de parseexact et l'appeler. :-)
@Chris, vous ne pouvez pas battre le temps O (n), car vous devez lire toutes les entrées pour trouver des valeurs min et max. Je suppose que dans un scénario réel, les valeurs sont non étalées, car sinon, cela n'aurait pas de sens.
@Fede True Vous auriez besoin de parcourir toute la liste pour l'ajouter à une collection différente. Le seul moyen de battre O (n) code> serait de commencer par un type de structure de tas.
Et pour Liste
Ceci est similaire à la réponse de @ Jeffrey, mais au lieu d'analyser chaque date, il trouve d'abord les dates MIN et max comparant ses valeurs de chaîne, puis analyses les valeurs à la fin.
// This method handles the date comparisons private int WeirdComparer(string strDate1, string strDate2) { int res = string.Compare(strDate1, 6, strDate2, 6, 4); if (res == 0) res = string.Compare(strDate1, 3, strDate2, 3, 2); if (res == 0) res = string.Compare(strDate1, 0, strDate2, 0, 2); return res; } public void FindMinAndMaxDates(IList<string> strDates, out DateTime minDate, out DateTime maxDate) { string min = "99.99.9999"; string max = "00.00.0000"; foreach (string strDate in strDates) { if (WeirdComparer(strDate, min) < 0) min = strDate; if (WeirdComparer(strDate, max) > 0) max = strDate; } minDate = DateTime.ParseExact(min, "dd.MM.yyyy", null); maxDate = DateTime.ParseExact(max, "dd.MM.yyyy", null); }
Ce FindMinandMaxdates code> a un
IList
Ne pas utiliser une chaîne, en utilisant uniquement DateTime Nullable i> B> type
Dans ce cas, vous n'avez pas besoin de la fonction weirdcomerer code>. Vous pouvez facilement vous échapper en utilisant le comparateur par défaut pour
DateTime? Code>. E.g
si (comparateur
Je sais que ce n'est pas une réponse directe à votre question, mais pourrait aider les autres s'ils viennent ici à la recherche de quelque chose de similaire.
J'ai couru aujourd'hui sur cette question tout en essayant de trouver juste la date maximale d'une liste d'objets. Parfois, il n'y aura pas de valeur à la date des objets afin que je devais déterminer comment utiliser une analyse d'essai avec ma linq. P>
d'une combinaison de la marque utilisée ici je suis venu avec cela pour résoudre mon problème p>