Вот, пожалуйста.Попробуйте следующее:
var xs = new [] { 1, 3, 5, 6, 23, };
var yss = new []
{
new [] { 3, },
new [] { 6, 1, },
new [] { 1, 3, 5, 23, 6, 14, 67, },
new [] { 2, 3, },
};
Сначала я отвечу на ваш второй вопрос:
var q2 =
from ys in yss
where !ys.Except(xs).Any()
select ys;
var q2b = yss.Where(ys => !ys.Except(xs).Any());
Эти два запроса идентичны - за исключением одного в LINQ и другого в методе расширениясинтаксис.Компилятор сгенерирует один и тот же код для обоих.
Вопрос первый - кошмар - гораздо сложнее сделать.
var q1 =
from z in yss.Zip(
xs.Aggregate(
yss.AsEnumerable(),
(_yss, x) => (
from ys in _yss
select ys.Except(new [] { x }).ToArray())),
(ys, _ys) => new { ys, _ys })
where !z._ys.Any()
select z.ys;
var q1b =
yss.Zip(
xs.Aggregate(
yss.AsEnumerable(),
(_yss, x) => _yss
.Select(ys =>
ys.Except(new [] { x }).ToArray())),
(ys, _ys) => new { ys, _ys })
.Where(z => !z._ys.Any())
.Select(z => z.ys);
Опять и в LINQ, и в синтаксисе метода расширения, и оба скомпилированы в один и тот жеcode.
Я выполнил несколько тестов производительности, и запросы "q2" выполнялись более чем в 10 раз быстрее, чем запросы "q1".
В одном тесте у меня было xs
с 61 отдельным элементом, yss
с 100 000 различнозначных вложенных коллекций с общим количеством 956 512 элементов, и запросы "q1" выполнялись за 5 354,1 миллисекунды, а "q2" выполнялся за 302,1 миллисекунды - коэффициент 17,7x.
Однако уменьшите это значение доxs
из 10 & yss
с 10 000 и 95 641, тогда результаты составили 115,3 и 7,4 миллисекунды соответственно.Любой подход, вероятно, будет достаточно быстрым.