web-dev-qa-db-ja.com

C#の日付で文字列リストを並べ替える

私はList<string>日付付き。
私のリストは次のとおりです。

{"01/01/2013","10/01/2013","20/01/2013"}

リストを次のように並べ替えたいと思います。

{"20/01/2013","10/01/2013","01/01/2013"}

どうすればこれを作ることができますか?

12
user1979270

Linqの場合:

_var list = new List<string> {"01/01/2013", "10/01/2013", "20/01/2013"};
var orderedList = list.OrderByDescending(x => DateTime.Parse(x)).ToList();
_

PDATE(コメントの質問による):

無効な日付は次のように扱うことができます(無効な日付はdefault(DateTime)として扱われます):

_var list = new List<string> { "01/01/2013", "10/01/2013", "N/A" , "20/01/2013"  };
var orderedList2 = list.OrderByDescending(x =>
            {
                DateTime dt;
                DateTime.TryParse(x, out dt);
                return dt;
            });
_

または、リストの最初の項目として無効な日時を設定する場合:

_var orderedList3 = list.OrderByDescending(x =>
            {
                DateTime dt;
                if (!DateTime.TryParse(x, out dt)) return DateTime.MaxValue;
                return dt;
            }); 
_

無効な日付を除外することもできます。

_var filteredList = list.Where(x =>
            {
                DateTime dt;
                return DateTime.TryParse(x, out dt);
            }).Select(DateTime.Parse).OrderByDescending(x => x);
_
26
mipe34

データの文字列表現を使用するべきではありません-私たちは皆、オブジェクト指向の世界に住んでいます:)

最善の方法は、これらの文字列を実際のDateTimeオブジェクトに変換し、linqを使用して逆の順序で並べ替えることです。

var dates = Array.ConvertAll(dateStrings, x => DateTime.Parse(x));
return dates.OrderByDesc(x => x);

別の方法は、カスタムソート機能を実装することです。 このリンク を参照してください。次に、それをソート関数で使用します。

DateAsStringComparer myComparer = new DateAsStringComparer();
dateStrings.Sort(myComparer);
4
Dmitry Reznik

これを試して:

List<string> s = new List<string>() { "01/01/2013", "10/01/2013", "20/01/2013" };
var d = s.OrderByDescending(i => DateTime.ParseExact(i, "dd/MM/yyyy", null));
3
Alex Filipovici

これらはUK/AUS形式(日/月/年)であるため、OrderByDescendingを使用して並べ替えることができます。

List<string> dates = new List<string>() { "01/01/2013", "10/01/2013", "20/10/2013" };

foreach (var date in dates.OrderByDescending(x => x))
    Console.WriteLine(date);

個人的には、最初にそれらをDateTimeオブジェクトに変換します。

0
Simon Whitehead

なぜList<string>の代わりにList<DateTime>を使用したいのですか?

List<DateTime> dates = ...

dates.OrderByDescending(c => c).ToList();
0
spajce

カスタム形式のDateTime文字列を統一形式のstringに変換するには、次の単純なsafeスニペットを採用できます。

_    string formatStr = "yyyyMMddHHmmss";
    string result = Convert.ToDateTime(inputStr).ToString(formatStr);
_

コード内では、formatStrDateTimeクラスが受け入れることができる任意の形式にすることができ、必要な形式として設定できます。ここでは、_dd/MM/yyyy_を使用できます。 「20/01/2013」などのターゲットフォーマット文字列。

したがって、あなたの場合、コードは次のように単純にすることができます。

_    List<string> list = new List<string> { "01/01/2013", "10/01/2013", "20/01/2013" };
    var listAfterSorting = list.OrderByDescending(t => 
        Convert.ToDateTime(t).ToString("dd/MM/yyyy")
            .ToList());
_

場合によっては、ParseExactを使用してデータ時間文字列を解析すると、エラー/例外_String was not recognized as a valid DateTime_がスローされます。その場合、TryParseExactを使用すると、結果はおそらく解析に失敗したため、default(DateTime) = _1/1/0001 12:00:00 AM_。したがって、ParseExactまたはTryParseExactはお勧めしません。

0
Bravo Yeung