Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有LINQ等效方法?_C#_.net_Linq - Fatal编程技术网

C# 是否有LINQ等效方法?

C# 是否有LINQ等效方法?,c#,.net,linq,C#,.net,Linq,我知道林克有办法。此方法确保每个集合中的每个项值以相同的顺序匹配 我想要的是一种更“等效”的功能。只是这两个序列包含相同的项,不一定顺序相同 例如,nUnit有CollectionAssert.AreEqual()和CollectionAssert.AreEqual(),它们完成了我要解释的内容 我知道我可以通过以下方式实现: 提前对列表排序并使用SequenceEquals 使用相交,然后查看相交是否等于原始序列 例如: var source = new[] {5, 6, 7}; source

我知道林克有办法。此方法确保每个集合中的每个项值以相同的顺序匹配

我想要的是一种更“等效”的功能。只是这两个序列包含相同的项,不一定顺序相同

例如,nUnit有
CollectionAssert.AreEqual()
CollectionAssert.AreEqual()
,它们完成了我要解释的内容

我知道我可以通过以下方式实现:

  • 提前对列表排序并使用
    SequenceEquals
  • 使用
    相交
    ,然后查看相交是否等于原始序列
  • 例如:

    var source = new[] {5, 6, 7};
    source.Intersect(new[] {5, 7, 6}).Count() == source.Length;
    

    您可以构建一个集合,然后使用。严格来说,它并不在LINQ内部,但它与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
    }
    
    publicstaticboolsetequals(此IEnumerable源,IEnumerable其他)
    {
    HashSet HashSet=新的HashSet(源);
    返回hashSet.SetEquals(其他);//不递归!调用hashSet.SetEquals
    }
    

    编辑:如注释中所述,这忽略了元素出现的次数以及顺序-因此
    {1,2}
    将“设置为等于”
    {1,2,1,2,1,1}
    。如果这不是您想要的,它会变得更复杂一些。

    我会创建一个扩展方法来进行相交,然后比较计数。

    我是这样做的:

    public static bool SetEquivalent<T>(
        this IEnumerable<T> aSet,
        IEnumerable<T> anotherSet)
    {
        var diffA = aSet.Except(anotherSet).Count();
        var diffB = anotherSet.Except(aSet).Count();
        return diffA == diffB && diffA == 0;
    }
    
    publicstaticboolsetequivalent(
    这是一个数不清的aSet,
    IEnumerable(其他集合)
    {
    var diffA=aSet.Except(anotherSet.Count();
    var diffB=anotherSet.Except(aSet.Count();
    返回diffA==diffB&&diffA==0;
    }
    
    那么1,2将“等于”1,1,1,2,2?@spender:对于集合相等,这是正确的。每个集合中的元素集是相同的。但是值得强调的是,will edit.Jon,有时在这样的方法中,我无法决定是按您的方式编写它,还是执行类似于
    HashSet HashSet=source as HashSet??新哈希集(源)
    可以节省构建新的
    哈希集的成本。你对此有什么看法吗?这非常有效,代码看起来非常紧凑:新的HashSet(new[]{5,6,7})。SetEquals(new[]{5,7,6})你得到了答案,因为你给了我比较计数的想法,所以它很好而且紧凑,谢谢!看起来是这样的:var source=new[]{5,6,7};source.Intersect(new[]{5,7,6}).Count()==source.Length@CubanX:请注意,如果源代码中包含任何重复项,则即使
    source.SetEquals(source)
    也将返回false。@Jon很好,我可能必须在其中插入一个distinct以确保不会发生这种情况。答案示例中有一个错误。您需要将其与这两个计数进行比较,否则当源是目标的子集时,您的函数将返回“true”。即源{5,6}和目标{5,7,6}