Проверьте, все ли элементы в коллекции с определенным значением находятся в другой коллекции с Linq? - PullRequest
1 голос
/ 12 августа 2011

Я знаю, что вы можете проверить, существуют ли все элементы из одного списка в другом списке, как это (из другого поста здесь):

bool result = list.All(x => dataList.Contains(x));

Но как мне проверить, все ли элементы в другом списке имеют одно и то же "подзначение"?

У меня есть два xml документа _mapdoc и _mapdocCopy, и я хочу сравнить все <file> элементы, где путь атрибута находится в другом xml документе.

Итак, я начал делать что-то похожее на:

if (_mapdocCopy.Descendants("file").All(x => _mapdoc.Descendants("file").Contains(x)))

Но я сразу понял, что при этом будут сравниваться все элементы <file>, и они часто не будут одинаковыми (они могут иметь разные подэлементы), даже если их атрибут «путь» имеет одинаковые значения. И только это я хочу проверить.

Я также (в другом контексте) хочу иметь возможность получать те, которые не совпадают (все еще в отношении только атрибута пути), поэтому помощь с этим также будет оценена. Но это другой вопрос, мне все еще нужен запрос Linq выше.

Есть идеи?

1 Ответ

3 голосов
/ 12 августа 2011

Я бы подумал о том, чтобы заменить .Contains на .Any( соответствующее условие ). Что-то вроде:

if (_mapdocCopy.Descendants("file").All(
        x => _mapdoc.Descendants("file").Any(y => y.path == x.path)))

Редактировать: Вторая часть объявления, подход грубой силы:

... = _mapdocCopy.Descendants("file").Where(
        x => !_mapdoc.Descendants("file").Any(y => y.path == x.path)))

(возьмите те, которые не существуют в другом наборе - обратите внимание, что замыкание отменено). Однако есть и метод Exyn linq. Я не уверен, что у меня правильный синтаксис, но это будет что-то вроде:

... = _mapdocCopy.Descendants("file").Except(
        _mapdoc.Descendants("file"),
        (x, y) => x.path == y.path)

(за исключением случаев, когда я не уверен, будет ли замыкание преобразовано в IEqualityComparer или ему понадобятся дополнительные хакеры)

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