Linq проверяет, находится ли список в другом списке - PullRequest
2 голосов
/ 13 июля 2020

Я сейчас работаю над проектом, где у меня есть склад. Склад разделен на множество зон (AJ). Кроме того, на складе есть много товаров, которые разбросаны по разным зонам. Когда покупатель покупает товары в интернет-магазине, это происходит как заказ. Заказ содержит несколько продуктов и в каких зонах они находятся.

Кроме того, я установил кратчайший путь из зоны A во все остальные зоны. Это сделано для того, чтобы свести к минимуму время, которое рабочие должны идти пешком, когда собирают продукты с полок.

Итак, для пути у меня есть список строк, который содержит путь, то есть A, B, C, I. Также у меня есть список заказов, где свойство zone также является списком строк. Скажем, у меня есть список заказов, содержащий следующие зоны:

Заказ 1: A, C

Заказ 2: C, I

Заказ 3: B , C

Порядок 4: A, F

Есть ли способ, используя Linq, где я могу получить все заказы, где зоны равны зонам на моем пути? Так, например, в этом примере я бы получил только заказы 1, 2 и 3. Не 4, потому что 4 содержит зону F, которая не находится в указанном пути.

Я пробовал следующее, что не сработало , потому что он также вернул заказ 4:

var jobs = (from j in db.jobs select j).ToList();
List<string> path = new List<string> (){"A","B","C","I"};
var jobsInPath = jobs.Where(x => x.zones.Intersect(path).Any()).ToList();

1 Ответ

2 голосов
/ 13 июля 2020

Вам нужно что-то вроде этого:

Orders.Where(x=> x.Zones.All(z=>Path.Zones.Contains(z))).ToList();

Ваше решение не работает, потому что:

var jobsInPath = jobs.Where(x => x.zones.Intersect(path).Any()).ToList();

Здесь Intersect возвращает общие строки ... Порядок 4 также содержит A, следовательно, для порядок 4, он вернет A, и выражение Any () будет истинным.

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