Я думаю, что это нужно сделать, это: listOfA.OrderBy(a => a.Years.Min(y => y.Key + y.Value.Min()/13d))
Если низкий год и месяц в словаре в 2000 Ян, например, это значение будет 2000 + 1/13 = 2000.0769
Тогда все, что осталось, чтобы выбрать наименьшее значение из каждого словаря и сортировать их по этому значению.
Примечание что значение 13
может быть 20
, а также, если вы хотите более хорошие номера по какой-то причине, но большая часть 12/x
должна быть меньше, чем 1, с тем чтобы придать большее значение для надлежаще года, так x
должно быть больше 12. Это предполагает, что диапазон месяцев составляет от 1 до 12 включительно.
Пример I/O:
var listOfA = new List<A>
{
new A
{
Name = "a1",
Years = new Dictionary<int, List<int>>
{
{2015, new List<int> {3, 4, 5, 6}},
{2016, new List<int> {2, 8, 9, 10}}
}
},
new A
{
Name = "a2",
Years = new Dictionary<int, List<int>>
{
{2013, new List<int> {3, 4, 5, 6}},
{2014, new List<int> {2, 8, 9, 10}}
}
},
new A
{
Name = "a3",
Years = new Dictionary<int, List<int>>
{
{2015, new List<int> {3, 4, 5, 6}},
{2014, new List<int> {2, 8, 9, 10}}
}
},
new A
{
Name = "a4",
Years = new Dictionary<int, List<int>>
{
{2014, new List<int> {1, 4, 5, 6}},
{2017, new List<int> {2, 8, 9, 10}}
}
}
};
// listOfA is now {a1, a2, a3, a4}
listOfA = listOfA.OrderBy(a => a.Years.Min(y => y.Key + y.Value.Min()/13d)).ToList();
// listOfA is now {a2, a4, a3, a1}
Как бы вы своего рода 'A1: ({10, {0}}, {12, {0}}), A2: ({11, {0}}, {13, {0}}) '? Если 'A1' идти первым, потому что самый низкий год у него есть до самого низкого года' A2'? Или вы разбиваете каждый A вверх и сортируете его в один большой A, например '{10, ..}, {11, ..}, {12, ..}, {13, ..}'? – SimpleVar
Да, сначала A1, затем A2. Никакой раскол, поскольку он будет дублировать объект А. Спасибо! –