17

私はList<string>日付を持っています。
私のリストは次のとおりです。

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

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

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

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

4

6 に答える 6

42

linq を使用:

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

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

無効な日付は次のように扱うことができます (無効な日付は として扱われます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);

またはさらに良い:

var filteredList = list.Select(x =>
        {
            DateTime dt;
            return new {valid = DateTime.TryParse(x, out dt), date = dt};
        }).Where(x => x.valid).Select(x => x.date).OrderByDescending(x => x);
于 2013-02-02T23:43:46.243 に答える
4

これを試して:

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));
于 2013-02-02T23:48:02.277 に答える
4

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

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

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

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

DateAsStringComparer myComparer = new DateAsStringComparer();
dateStrings.Sort(myComparer);
于 2013-02-02T23:43:25.417 に答える
1

List<string>の代わりに使用する理由は何List<DateTime>ですか?

List<DateTime> dates = ...

dates.OrderByDescending(c => c).ToList();
于 2013-02-02T23:47:30.493 に答える
0

これらは 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オブジェクトに変換します..

于 2013-02-02T23:43:29.370 に答える