检查具有特定值的集合中的所有项目是否都在Linq的另一个集合中?

时间:2011-08-12 07:43:33

标签: linq c#-4.0

我知道你可以检查一个列表中的所有元素是否都存在于另一个列表中(来自此处的另一篇文章):

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 个答案:

答案 0 :(得分:3)

我认为将.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)))

(拿另一组中不存在的那些 - 注意闭包被否定)。然而,除了linq方法也有。我不确定我的语法是否正确,但它会是这样的:

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

(除非我不确定闭包是否会转换为IEqualityComparer或需要一些额外的hackery)