Хорошо, у меня есть список списков, которые я хотел бы отсортировать. Во-первых, некоторый код:
foreach (var Row in Result)
{
foreach (var RowAll in Row.All)
{
DataObject.Add(new List<string>() { RowAll.Value1, RowAll.Value2, RowAll.Value3});
break;
}
}
Теперь я хочу отсортировать родительский список по Value2 каждого дочернего списка. Действительно ли это возможно? Если так, как я могу сделать это?
Вы можете сделать это через LINQ:
// I'm assuming here that "LastCheckin" is defined as List<List<string>> or similar
// ...
var sorted = Data.LastCheckin.OrderBy(list => list[1]);
Это вернет IEnumerable
, содержащий ваши "списки", отсортированные по второму значению в подсписке (Value2). >
Если вы хотите сортировать список на месте, вы можете использовать List
вместо этого:
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]) );
Для обработки более сложной проверки, вы можете разбить вашу лямбду на несколько строк:
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, и должно поместить их в конец сортировки.