是否有LINQ等效方法?

Cub*_*anX 6 .net c# linq

我知道LINQ有一个SequenceEquals方法.此方法确保每个集合中的每个项目值以相同的顺序匹配.

我正在寻找的是更"等效"的功能.只是两个序列包含相同的项目,不一定是相同的顺序.

例如,NUnit的有CollectionAssert.AreEqual()CollectionAssert.AreEquivalent()这做我解释.

我知道我可以通过以下方式做到这一点:

  1. 提前订购列表并使用 SequenceEquals
  2. 使用Intersect,然后查看交集是否等于原始序列.

例:

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 }.如果这不是你想要的,它会变得更复杂一些.


Tob*_*oby 8

我会创建一个执行交叉的扩展方法,然后比较计数.