Как отсортировать список списков?

Хорошо, у меня есть список списков, которые я хотел бы отсортировать. Во-первых, некоторый код:

    foreach (var Row in Result)
    {
        foreach (var RowAll in Row.All)
        {
            DataObject.Add(new List<string>() { RowAll.Value1, RowAll.Value2, RowAll.Value3});
            break; 
        }
    }

Теперь я хочу отсортировать родительский список по Value2 каждого дочернего списка. Действительно ли это возможно? Если так, как я могу сделать это?

6
задан sooprise 23 June 2010 в 17:32
поделиться

1 ответ

Вы можете сделать это через 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.Sort вместо этого:

 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, и должно поместить их в конец сортировки.

13
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: