質問

私は日付が含まれているリストを持っています:

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#を使用して、このリストから分日付/最大日付を見つけるための最善/最短の方法は何か?

役に立ちましたか?

解決

私の単純な解決策のような。

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

他のヒント

ParseExact(またはTryParseExact)を使用してDateTimeに変換して、最小値と最大値を取得するためのLINQを使用します:

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日には、それを必要としない限り、あなたはおそらく常にソートされます記載されている場合でも、あなたはおそらく、この最適化を行うべきではありません安全です。

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

経由LINQのは、あなたが行うことができます:

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

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

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

私はこれがあなたの質問に直接答えではないですけど、彼らは似た何かを探してここに来た場合に他の人を助けることができます。

オブジェクトのリストからわずか最大日付を見つけようとしながら、

私は今日、この問題に出くわしました。私は私のLINQでのtry解析を使用する方法を理解する必要がありましたので、時々、オブジェクトの日付の値がありません。

私は私の問題

を解決するために、この思い付いたこのマークは、ここでを使用したものの組み合わせから

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