在单次评估中检查两个列表是否具有相同的元素。

3
我是一名有用的助手,可以为您翻译文本。

可能重复:
比较两个集合是否相等

我有两个列表。

List<int> Foo = new List<int>(){ 1, 2, 3 };

并且

List<int> Bar = new List<int>(){ 2, 1 };

为了确定它们是否具有相同的元素,我进行了以下操作。
if(Foo.Except(Bar).Any() || Bar.Except(Foo).Any())
{
    //Do Something
}

但这需要进行两次布尔值评估。首先,它执行 Foo.Except(Bar).Any(),然后是 Bar.Except(Foo).Any()。有没有一种方法可以在单个评估中完成这个操作?

期望的结果是什么 - 查找两个集合中是否存在相同元素,或查找集合中所有元素是否相同(但可能顺序不同)? - Sergey Berezovskiy
@lazyberezovsky:顺序不重要,只需检查Foo中是否有任何元素不存在于Bar中或存在于Bar中但不存在于Foo中。 - Nikhil Agrawal
2个回答

1
        var sharedCount = Foo.Intersect(Bar).Count();
        if (Foo.Distinct().Count() > sharedCount || Bar.Distinct().Count() > sharedCount)
        {
            // there are different elements
        }
        {
            // they contain the same elements
        }

“Union” 对结果应用 “Distinct”。因此,如果初始序列具有非唯一元素,则计数可能不同。 - Sergey Berezovskiy

-4

你不需要检查两次。 只需像这样做(注意Foo,它可能为空并抛出相关异常)

if(Foo.Intersect(Bar).Any())
{
    //Do Something
}

你可能还想先检查一下这两个列表是否为空或为null..但只有在这种情况对你有特殊价值时才需要。


它针对给定的例子返回true,但应该是false。 - Uriil
我认为这不是海报想要的内容。它只会告诉您两者之间是否有任何共享元素,而不是所有元素都被共享。 - armen.shimoon
如果Foo和Bar有“共享”的元素(至少一个),则返回true。 - Salaros
即使列表按相同顺序包含相同元素,它也会进入if语句中。 - Nikhil Agrawal
@Nikhil Agrawal你说的“即使列表包含……也会进入其中”是什么意思? 我不明白。 - Salaros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接