Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# 比较两个不按顺序排列的列表';没关系,使用iQualityComparer_C#_Linq - Fatal编程技术网

C# 比较两个不按顺序排列的列表';没关系,使用iQualityComparer

C# 比较两个不按顺序排列的列表';没关系,使用iQualityComparer,c#,linq,C#,Linq,我想检查两个列表是否包含相同的项目。项目的顺序无关紧要,相同的项目可能会在每个列表中出现两次 例如: var List1 = new List<int> { 1, 2, 2 }; var List2 = new List<int> { 2, 1, 2 }; //equal var List1 = new List<int> { 1, 2, 2 }; var List2 = new List<int> { 2, 1, 1 }; //not equa

我想检查两个列表是否包含相同的项目。项目的顺序无关紧要,相同的项目可能会在每个列表中出现两次

例如:

var List1 = new List<int> { 1, 2, 2 };
var List2 = new List<int> { 2, 1, 2 };
//equal

var List1 = new List<int> { 1, 2, 2 };
var List2 = new List<int> { 2, 1, 1 };
//not equal - different quantities of 1s and 2s in the two lists

但是,现在我需要为这两个项目使用
IEqualityComparer
,而
Remove
无法接受。有人能想出一个解决这个问题的有效办法吗?如果它接受的是
IEnumerable
而不是
列表

,那么它也会很有用。试试看,这应该适合您的情况:

return ListA.OrderBy(x => x).SequenceEqual(ListB.OrderBy(x => x));

只是一个临时订单,然后进行比较

尝试此操作应适用于您的情况:

return ListA.OrderBy(x => x).SequenceEqual(ListB.OrderBy(x => x));

只是一个临时订单,然后比较

您可能会使用的解决方案是:

  • 创建两个具有原始列表不同值的列表
  • 将两个不同的值列表相交为一个包含所有不同值的列表
  • 对于组合不同值列表中的每个项目,计算每个原始列表中出现的次数
  • 代码:

    var list1=新列表{1,2,2};
    var list2=新列表{1,1,2};
    var list1Distinct=list1.Distinct();
    var list2Distinct=list1.Distinct();
    var allDistinctValues=list1.Intersect(list2);
    bool listsEqual=true;
    foreach(所有distinct值中的int i)
    {
    int list1Count=0;
    int list2Count=0;
    list1Count=list1.Count(val=>val==i);
    list2Count=list2.Count(val=>val==i);
    if(list1Count!=list2Count)
    {
    listsEqual=false;
    }
    }
    如果(!listsEqual)
    {
    //列表项计数不相同
    }
    
    您可以使用的解决方案是:

  • 创建两个具有原始列表不同值的列表
  • 将两个不同的值列表相交为一个包含所有不同值的列表
  • 对于组合不同值列表中的每个项目,计算每个原始列表中出现的次数
  • 代码:

    var list1=新列表{1,2,2};
    var list2=新列表{1,1,2};
    var list1Distinct=list1.Distinct();
    var list2Distinct=list1.Distinct();
    var allDistinctValues=list1.Intersect(list2);
    bool listsEqual=true;
    foreach(所有distinct值中的int i)
    {
    int list1Count=0;
    int list2Count=0;
    list1Count=list1.Count(val=>val==i);
    list2Count=list2.Count(val=>val==i);
    if(list1Count!=list2Count)
    {
    listsEqual=false;
    }
    }
    如果(!listsEqual)
    {
    //列表项计数不相同
    }
    
    您可以尝试的另一个选项是:

    var lookup1 = List1.ToLookup(x => x);
    var lookup2 = List2.ToLookup(x => x);
    
    return lookup1.Count == lookup2.Count && lookup1.All(x => lookup2[x.Key].SequenceEqual(x));
    

    这不需要完全排序,可能会更快地返回结果。

    您可以尝试的另一个选项是:

    var lookup1 = List1.ToLookup(x => x);
    var lookup2 = List2.ToLookup(x => x);
    
    return lookup1.Count == lookup2.Count && lookup1.All(x => lookup2[x.Key].SequenceEqual(x));
    

    这不需要进行完全排序,而且可能会更快地返回结果。

    您能先对列表排序吗?然后你可以做一个普通的?为什么不使用收集(
    List
    )的
    .Contains()
    方法?看看this@R.Garc“因为第一个例子,a不起作用。”@VanVO Nope。只有当同一个列表中的两个项目不相等时,这种方法才有效。您可以先对列表进行排序吗?然后你可以做一个普通的?为什么不使用收集(
    List
    )的
    .Contains()
    方法?看看this@R.Garc“因为第一个例子,a不起作用。”@VanVO Nope。只有当同一个列表中的两个项目不相等时,这种方法才有效。如果
    List2
    的键比
    List1
    的键多,则需要同时进行检查。@LasseVågsætherKarlsen-非常好。现在,通过在开始时进行简单的
    .Count
    比较,这是一个更好的解决方案。如果
    List2
    的键比
    List1
    的键多,则需要同时检查两种方式。@LasseVågsætherKarlsen-非常好。现在,通过在开始时进行简单的
    .Count
    比较,这是一个更好的解决方案。除非它们是相同的,否则没有意义。