gpt4 book ai didi

c# - 如何检查集合(> 2)的内容是否相同

转载 作者:太空狗 更新时间:2023-10-29 22:23:51 25 4
gpt4 key购买 nike

我有一个列表。出于正当理由,我多次复制列表并将其用于不同目的。在某些时候,我需要检查所有这些集合的内容是否相同。

好吧,我知道怎么做了。但是作为“速记”编码 (linq...) 的粉丝,我想知道我是否可以用最短的代码行数有效地检查它。

    List<string> original, duplicate1, duplicate2, duplicate3, duplicate4
= new List<string();

//...some code.....
bool isequal = duplicate4.sequenceequal(duplicate3)
&& duplicate3.sequenceequal(duplicate2)
&& duplicate2.sequenceequal(duplicate1)
&& duplicate1.sequenceequal(original);//can we do it better than this

更新

Codeinchaos 指出了某些我没有想到的场景(重复项和列表顺序)。虽然 sequenceequal 会处理重复项,但列表的顺序可能是个问题。所以我正在按如下方式更改代码。我需要为此复制列表。

List<List<string>> copy = new List<List<int>> { duplicate1, duplicate2,  
duplicate3, duplicate4 };
bool iseqaul = (original.All(x => (copy.All(y => y.Remove(x))))
&& copy.All(n => n.Count == 0));

更新 2

感谢 Eric,使用 HashSet 可以非常高效,如下所示。不过,这不会涵盖重复项。

List<HashSet<string>> copy2 =new List<HashSet<string>>{new HashSet<string>(duplicate1),
new HashSet<string>(duplicate2),
new HashSet<string> duplicate3),
new HashSet<string>(duplicate4)};
HashSet<string> origninalhashset = new HashSet<string>(original);
bool eq = copy2.All(x => origninalhashset.SetEquals(x));

更新 3感谢 Eric - 这篇文章中使用 SequenceEqual 的原始代码将用于排序。由于 Sequenceequal 会考虑集合的顺序,所以在调用 sequenceequal 之前需要对集合进行排序。我想这不是什么大问题,因为排序非常快 (nlogn)。

更新4根据 Brian 的建议,我可以为此使用查找。

var originallkup = original.ToLookup(i => i);    
var lookuplist = new List<ILookup<int, int>>
{ duplicate4.ToLookup(i=> i),
duplicate3.ToLookup(i=> i),
duplicate2.ToLookup(i=> i),
duplicate1.ToLookup(i=> i)
};

bool isequal = (lookuplist.Sum(x => x.Count) == (originallkup.Count * 4)) &&
(originallkup.All(x => lookuplist.All(i => i[x.Key].Count() == x.Count())));

谢谢大家的回复。

最佳答案

I have a List. I duplicate the List many times and use it for different purposes. At some point I need to check if the contents of all these collections are same.

评论者然后问:

Is the order important? Or just the content?

然后你回应:

only the content is important

在那种情况下您一开始就使用了错误的数据结构。使用 HashSet<T> , 不是 List<T> , 表示一个无序项目集合,必须便宜地比较集合相等性

一旦您将所有内容都放在哈希集中而不是列表中,您可以简单地使用他们的 SetEquals查看是否有任何一对集合不相等的方法。

或者:将所有内容都保存在列表中,直到您想要比较是否相等为止。从其中一个列表初始化哈希集,然后使用 SetEquals 将该哈希集与其他每个列表进行比较。

关于c# - 如何检查集合(> 2)的内容是否相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9210699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com