LINQ - Выберите строки в зависимости от того, соответствует ли их сумма условию - PullRequest
0 голосов
/ 28 апреля 2020

Я столкнулся с проблемой, так как не могу получить корректный рабочий оператор LINQ здесь.

Предположим, у меня есть DataTable с x строками, и я должен отсортировать по сумме столбец Quantity. Тогда у меня есть условие Запрошенное количество = 20 . Мне нужно найти строки, равные точной сумме RequestedQuantity, но только там, где ей соответствует комбинация из 3 строк.

    +-----+----------+
    | Bin | Quantity |
    +-----+----------+
    |   <b>1</b> |       <b>10</b> |
    |   <b>2</b> |        <b>5</b> |
    |   <b>3</b> |        <b>5</b> |
    |   4 |       10 |
    |   5 |       15 |
    +-----+----------+

Кажется, я не могу понять правильный синтаксис LINQ чтобы заставить это работать. Моя отправная точка такова:

From row In StorageBins.AsEnumerable.GroupBy( _
Convert.ToDouble(Function (x) x("Quantity"), cultureInfo)).Sum( _
Function (y) Convert.ToDouble(y("Quantity"), cultureInfo) = _
Double.Parse(RequestedQuantity,cultureInfo))

Изначально я просто пытаюсь получить любые строки, которые соответствуют моему состоянию. Однако моей конечной целью является получение любых трех строк, которые в точности соответствуют моему Запрошенному количеству .

Я, к сожалению, не эксперт в LINQ. Я надеюсь, что некоторые из вас могут быть!

1 Ответ

5 голосов
/ 28 апреля 2020

Может быть, я что-то упускаю, но на самом деле это кажется довольно сложной проблемой. Выберите любые 3 записи, но только 3, которые в сумме составляют ровно 20. Сколько строк в базе данных? Потому что это может быть довольно много потенциальных комбинаций довольно быстро. А что ты делаешь после того, как получишь 3? Вам нужно go выполнить рекурсивный анализ и сгруппировать другие записи? Или вам просто нужен первый набор из 3, который добавляет до 20?

Если вам просто нужны первые 3, я бы сделал что-то вроде этого:

  • Получить первую запись, которая меньше 20. Удалите его из списка ввода и поместите в целевой набор.
  • Затем получите первую запись, которая меньше 20 минус первого значения. ie если первое значение было «5», получить записи, которые меньше 15 (20 минус 5). Это гарантирует, что вы «оставите место» для третьего значения. Удалите его из исходного списка и в свой целевой набор.
  • Затем получите первую запись, которая ровно 20 минус номер один минус номер два. Удалите его из списка ввода и в целевой набор.

Теперь вам придется делать это в итераторах. Если нет значения, соответствующего третьему критерию, отпустите третье значение из целевого набора и поместите его обратно в список ввода. Затем go вернитесь к шагу 2 и выберите следующую запись, которая соответствует шагу 2 (и в идеале она не равна предыдущему значению). И если вы исчерпаете все итерации на шаге 2, go вернитесь к шагу 1 и выберете там следующее значение, и начнете все заново ...

Если только я неправильно понимаю ваше требование. ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...