C#中高效比较具有相同元素和出现次数的无序列表
在C#中,当元素的顺序不重要时,比较两个列表的相等性可能具有挑战性。对于包含多个相同元素的列表,确定等价性变得更加复杂。
考虑比较List
排序后比较
一种直接的方法是在比较之前对两个列表进行排序。使用以下代码片段,您可以检查元素相等性和顺序无关性:
<code class="language-c#">Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))</code>
基于字典的比较
为了提高性能,请考虑使用ScrambledEquals方法,该方法利用字典来计算元素出现的次数:
<code class="language-c#">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2)</code>
此方法使用字典填充键,表示唯一元素,值表示list1中每个元素出现的次数。然后,它遍历list2,递减匹配元素的计数。如果list2中的任何元素在字典中找不到或计数不匹配,则该函数返回false。最后,它确保字典中的所有计数都为零,这表示两个列表中的出现次数相等。
处理可空类型
为了适应可空类型或任何数据类型作为字典键,请在ScrambledEquals方法中提供自定义比较器:
<code class="language-c#">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2, IEqualityComparer<T> comparer)</code>
通过结合此功能,您可以有效地比较列表,而不管元素的顺序和计数如何。
以上是如何在 C# 中有效比较两个具有重复元素的无序列表?的详细内容。更多信息请关注PHP中文网其他相关文章!