C# - 从列表中计算最小日期/最大日期

时间:2010-02-25 21:30:14

标签: asp.net date find max min

我有一个包含日期的列表:

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#从这个列表中找出最短/最短日期的最佳/最短方法是什么?

6 个答案:

答案 0 :(得分:24)

使用ParseExact(或TryParseExact)将它们转换为DateTime,然后使用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(1)而不是O(n)。但是上面的内容更安全,所以即使你列出的内容可能总是被排序,你可能不应该进行这种优化,除非你真的需要它,以防有一天列表没有排序。

答案 1 :(得分:18)

我喜欢简单的解决方案。

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

答案 2 :(得分:17)

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

答案 3 :(得分:2)

通过Linq,您可以:

from row in StringDates
group row by true into r 
select new { 
    min = r.Min(z => z), 
    max = r.Max(z => z) 
}

答案 4 :(得分: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);
}

答案 5 :(得分:0)

我知道这不是你问题的直接答案,但如果他们来这里寻找类似的东西,可以帮助别人。

今天我试图从对象列表中找到最大日期时遇到了这个问题。有时在对象的日期中没有值,所以我必须弄清楚如何使用我的linq进行try解析。

从马克使用的here的组合中我想出了解决我的问题

        List<string> stringDates = new List<string>();
        stringDates.Add("Not a date");
        stringDates.Add("2015-01-01");
        stringDates.Add("2015-10-10");
        stringDates.Add("2015-9-10");
        stringDates.Add("123");

        DateTime sapInvoiceDate;
        DateTime tempDate = DateTime.MinValue;
        sapInvoiceDate = stringDates.Select(x => DateTime.TryParse(x, out tempDate)).Select(x => tempDate).Max();