我知道LINQ有一个SequenceEquals方法.此方法确保每个集合中的每个项目值以相同的顺序匹配.
我正在寻找的是更"等效"的功能.只是两个序列包含相同的项目,不一定是相同的顺序.
例如,NUnit的有CollectionAssert.AreEqual()和CollectionAssert.AreEquivalent()这做我解释.
我知道我可以通过以下方式做到这一点:
SequenceEqualsIntersect,然后查看交集是否等于原始序列.例:
var source = new[] {5, 6, 7};
source.Intersect(new[] {5, 7, 6}).Count() == source.Length;
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 10
你可以构建一个集合然后使用HashSet<T>.SetEquals.它并不严格在LINQ中,但它与它很好地搭配:)
当然,您可以轻松编写自己的扩展方法来扩展它.像这样的东西:
public static bool SetEquals<T>(this IEnumerable<T> source, IEnumerable<T> other)
{
HashSet<T> hashSet = new HashSet<T>(source);
return hashSet.SetEquals(other); // Doesn't recurse! Calls HashSet.SetEquals
}
Run Code Online (Sandbox Code Playgroud)
编辑:如评论中所述,这忽略了元素出现的次数,以及排序 - 因此{ 1, 2 }将"设置为等于" { 1, 2, 1, 2, 1, 1, 1 }.如果这不是你想要的,它会变得更复杂一些.