10

Dates を含む List があります:

List<string> StringDates;

    [0]: "04.03.2010"
    [1]: "09.03.2010"
    [2]: "11.03.2010"
    [3]: "12.03.2010"
    [4]: "16.03.2010"
    [5]: "18.03.2010"
    [6]: "19.03.2010"
    [7]: "23.03.2010"
    [8]: "25.03.2010"
    [9]: "26.03.2010"

C#を使用して、このリストから最小日付/最大日付を見つけるための最良/最短の方法は何ですか?

4

6 に答える 6

28

それらDateTimeを ParseExact (または TryParseExact) を使用して変換し、Linq を使用して Min と Max を取得します。

List<DateTime> dates = StringDates
   .Select(x => DateTime.ParseExact(x, "dd.MM.yyyy", null))
   .ToList();
DateTime minDate = dates.Min();
DateTime maxDate = dates.Max();

あなたの例では、リストはすでに昇順でソートされていることに注意してください。これが常に当てはまることを保証でき、パフォーマンスを向上させたい場合は、最初と最後の要素を O(n) ではなく O(1) にすることができます。ただし、上記の方が安全なので、リストが常にソートされる可能性があるとしても、実際に必要でない限り、この最適化を行うべきではありません。

于 2010-02-25T21:38:52.143 に答える
21

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));
于 2010-02-25T21:36:08.167 に答える
19

シンプルなソリューションが好きです。

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;
}
于 2010-02-25T21:39:45.470 に答える
2

Linq を介して、次のことができます。

from row in StringDates
group row by true into r 
select new { 
    min = r.Min(z => z), 
    max = r.Max(z => z) 
}
于 2010-02-25T21:33:48.027 に答える
0

これは @Jeffrey の回答に似ていますが、各日付を解析する代わりに、最初に文字列値を比較して最小日付と最大日付を見つけ、最後に値を解析します。

// 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);
}
于 2010-02-25T22:27:58.527 に答える