9
votes

C # - Calculer la date de la date / maximum de la liste d'une liste

J'ai une liste contenant des dates: xxx

à l'aide de C # Quel est le moyen le meilleur / le plus court pour trouver la date de la date / maximum de cette liste? >


0 commentaires

6 Réponses :


2
votes

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


1 commentaires

La liste est une liste . Les chaînes min et max ne représentent pas nécessairement les dates min et max.



21
votes

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


0 commentaires

27
votes

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


0 commentaires

19
votes

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


6 commentaires

J'ai effectivement commencé à écrire la même méthode, je ne pense pas que beaucoup pourrait être faite pour battre O (n) si vous ne le mettez pas dans un type de structure de tas qui vous permettrait de le résoudre dans O (logn) 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) serait de commencer par un type de structure de tas.


Et pour Liste ?



0
votes

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


3 commentaires

Ce FindMinandMaxdates a un IList en entrée. Comment représenteriez-vous une date d'heure nulle? Comme une chaîne nulle? Vous devrez simplement changer le curi-cadre pour gérer les dates NULL, utilisez également une comparaison sémirante des dates nultes constante, puis sautez le parseexact si la date min / maximum est null.


Ne pas utiliser une chaîne, en utilisant uniquement DateTime Nullable type


Dans ce cas, vous n'avez pas besoin de la fonction weirdcomerer . Vous pouvez facilement vous échapper en utilisant le comparateur par défaut pour DateTime? . E.g si (comparateur . Default.cacher (Nullabledate, Min) <0) .



0
votes

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.

d'une combinaison de la marque utilisée ici je suis venu avec cela pour résoudre mon problème xxx


0 commentaires