私はList<string>
日付付き。
私のリストは次のとおりです。
{"01/01/2013","10/01/2013","20/01/2013"}
リストを次のように並べ替えたいと思います。
{"20/01/2013","10/01/2013","01/01/2013"}
どうすればこれを作ることができますか?
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);
_
データの文字列表現を使用するべきではありません-私たちは皆、オブジェクト指向の世界に住んでいます:)
最善の方法は、これらの文字列を実際のDateTimeオブジェクトに変換し、linqを使用して逆の順序で並べ替えることです。
var dates = Array.ConvertAll(dateStrings, x => DateTime.Parse(x));
return dates.OrderByDesc(x => x);
別の方法は、カスタムソート機能を実装することです。 このリンク を参照してください。次に、それをソート関数で使用します。
DateAsStringComparer myComparer = new DateAsStringComparer();
dateStrings.Sort(myComparer);
これを試して:
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));
これらは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
オブジェクトに変換します。
なぜList<string>
の代わりにList<DateTime>
を使用したいのですか?
List<DateTime> dates = ...
dates.OrderByDescending(c => c).ToList();
カスタム形式のDateTime文字列を統一形式のstring
に変換するには、次の単純なsafe
スニペットを採用できます。
_ string formatStr = "yyyyMMddHHmmss";
string result = Convert.ToDateTime(inputStr).ToString(formatStr);
_
コード内では、formatStr
はDateTime
クラスが受け入れることができる任意の形式にすることができ、必要な形式として設定できます。ここでは、_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
はお勧めしません。