您可以通过 LINQ 执行此操作:
// I'm assuming here that "LastCheckin" is defined as List<List<string>> or similar
// ...
var sorted = Data.LastCheckin.OrderBy(list => list[1]);
这将返回一个IEnumerable<List<string>>
包含按子列表中的第二个值 (Value2) 排序的“列表”。
如果你想对列表进行排序,你可以使用List<T>.Sort http://msdn.microsoft.com/en-us/library/w56d4y5z.aspx反而:
Data.LastCheckin.Sort( (a,b) => a[1].CompareTo(b[1]) );
如果您需要在运行时指定升序或降序,处理此问题的简单方法是:
bool ascending = true; // Set to false for decending
int mult = ascending ? 1 : -1;
Data.LastCheckin.Sort( (a,b) => mult * a[1].CompareTo(b[1]) );
为了处理更复杂的检查,您可以将 lambda 拆分为多行:
bool ascending = true; // Set to false for decending
string myDateFormat = GetDateFormat(); // Specify date format
int mult = ascending ? 1 : -1;
Data.LastCheckin.Sort( (aStr,bStr) =>
{
DateTime a, b;
bool aSuccess = DateTime.TryParseExact(aStr[1], myDateFormat, DateTimeStyles.None, CultureInfo.InvariantCulture, out a);
bool bSuccess = DateTime.TryParseExact(bStr[1], myDateFormat, DateTimeStyles.None, CultureInfo.InvariantCulture, out b);
int result;
if (!aSuccess)
result = bSuccess ? -1 : 0;
else if (!bSuccess)
result = 1;
else
result = a.CompareTo(b);
return mult * result;
});
这会处理 a 和 b 上的解析器失败,并且应该将它们放在排序的末尾。