比较元组列表的最佳方法

3

我有两个列表,它们来自不同的来源。最好的方法是如何检查这两个列表是否包含相同的项?顺序并不重要。

List<Tuple<string, string, string>> list1;
List<Tuple<string, string, string>> list2;

你的检查函数应该返回true,如果它们包含完全相同的项目但可能顺序不同?或者如果一个有更多的项目,那也可以吗? - Florian Koch
“最好”的方式只有您自己可以决定,而不是我们。您已经尝试过自己解决这个问题了吗?您尝试了什么?请展示那段代码,我们不会为您编写它。” - DavidG
1
https://dev59.com/vHI95IYBdhLWcg3w_zQN?rq=1 - René Vogt
@RenéVogt,字符串和元组是有区别的。但我同意这种一般性的方法是相同的,你只需要提供一个比较器。 - Florian Koch
@FlorianKoch 但这里并没有什么区别,元组的默认相等比较器使用其所有元素的默认相等比较器。这里的问题只是如何比较列表,列表元素的类型并不重要。 - René Vogt
1个回答

12

您可以使用!Except.Any

bool same = list1.Count == list2.Count && !list1.Except(list2).Any();

解释:

  1. 检查两个列表是否具有相同的Count,否则您就会知道它们不包含相同的元素。
  2. 然后使用ExceptAny检查在从list1中“删除”list2后是否剩余元组。如果存在Any(至少一个),则说明它们不包含相同的元素。

此方法有效是因为元组覆盖了GetHashCode(像匿名类型一样)和string也覆盖了。


1
请至少提供一份简短的说明,解释这段代码是如何运作的以及为什么会这样运作。 - Florian Koch
1
@FlorianKoch:已添加,这样做有意义吗? - Tim Schmelter
是的,完美的 (: - Florian Koch
除了性能方面是O(n+m),根据此链接https://dev59.com/VGkv5IYBdhLWcg3w6k5Q - Jimmy

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