Вот неполная попытка использования LINQ для получения двух последовательностей: одна для перечисления вперед (начиная с максимального элемента) и одна для перечисления назад.После этой точки нелегко продолжить работу с LINQ, поскольку две последовательности должны быть пронумерованы параллельно сложным образом, поэтому я пошел с циклом while.
var mainsd = new SortedDictionary<double, int>()
{
{500.10, 500}, {500.09, 1000}, {500.08, 2000}, {500.07, 3000},
{500.06, 4500}, {500.05, 5500}, {500.04, 6000}, {500.03, 7000},
{500.02, 8500}, {500.01, 9500}, {500.00, 10000}, {499.99, 9000},
{499.98, 8000}, {499.97, 7500}, {499.96, 6500}, {499.95, 5000},
{499.94, 4000}, {499.93, 3500}, {499.92, 2500}, {499.91, 1500},
{499.90, 550},
};
var maxValue = mainsd.Max(e => e.Value);
var maxItemKey = mainsd.First(e => e.Value == maxValue).Key;
var forward = mainsd.SkipWhile(e => e.Key <= maxItemKey).ToArray();
var backward = mainsd.TakeWhile(e => e.Key < maxItemKey).Reverse().ToArray();
int i1 = 0;
int i2 = 0;
while (true)
{
var sum1 = i1 < forward.Length - 1 ? forward[i1].Value + forward[i1 + 1].Value : 0;
var sum2 = i2 < backward.Length - 1 ? backward[i2].Value + backward[i2 + 1].Value : 0;
if (sum1 == 0 && sum2 == 0) break;
if (sum1 >= sum2)
{
Console.WriteLine($"Forward: {sum1}, Keys: {forward[i1].Key}, {forward[i1 + 1].Key}");
i1 += 2;
}
else
{
Console.WriteLine($"Backward: {sum2}, Keys: {backward[i2 + 1].Key}, {backward[i2].Key}");
i2 += 2;
}
}
Вывод:
Forward: 18000, Keys: 500,01, 500,02
Backward: 17000, Keys: 499,98, 499,99
Backward: 14000, Keys: 499,96, 499,97
Forward: 13000, Keys: 500,03, 500,04
Forward: 10000, Keys: 500,05, 500,06
Backward: 9000, Keys: 499,94, 499,95
Backward: 6000, Keys: 499,92, 499,93
Forward: 5000, Keys: 500,07, 500,08
Backward: 2050, Keys: 499,9, 499,91
Forward: 1500, Keys: 500,09, 500,1
Обновление: Вот что не хватает для завершения программы.Перед входом в цикл while
мы создаем словарь valuesd
:
var valuesd = new SortedDictionary<double, int>();
Внутри цикла while
есть два случая.Если sum1 >= sum2
мы добавим две записи из списка пересылки:
valuesd.Add(forward[i1].Key, forward[i1].Value);
valuesd.Add(forward[i1 + 1].Key, forward[i1 + 1].Value);
В противном случае (else
) мы добавим две записи из списка пересылки:
valuesd.Add(backward[i2].Key, backward[i2].Value);
valuesd.Add(backward[i2 + 1].Key, backward[i2 + 1].Value);
В концецикл while
мы проверяем, достигли ли мы цели 50%.Если мы это сделаем, пришло время выйти из цикла, вызвав break
.
if (valuesd.Values.Sum() >= mainsd.Values.Sum() * 50 / 100) break;
После выхода из цикла словарь valuesd
заполняется необходимыми записями.