是否有C#等同于C++的std :: set_difference?

Bil*_*eal 2 c# c++

如果是这样,它是什么?

编辑:回应下面的评论:

var tabulatedOutputErrors = from error in outputErrors
                            group error by error into errorGroup
                            select new { error = errorGroup.Key, number = errorGroup.Count() };
var tabulatedInputErrors = from error in inputErrors
                           group error by error into errorGroup
                           select new { error = errorGroup.Key, number = errorGroup.Count() };
var problems = tabulatedOutputErrors.Except(tabulatedInputErrors);
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以扩展计数.

Nol*_*rin 9

LINQ有Enumerable.Except扩展方法,这似乎是你正在寻找的.

例:

var list1 = new int[] {1, 3, 5, 7, 9};
var list2 = new int[] {1, 1, 5, 5, 5, 9};

var result = list1.Except(list2); // result = {3, 7}
Run Code Online (Sandbox Code Playgroud)

替代方案:

从.NET 3.5开始,还存在HashSet<T>类(以及SortedSet<T>.NET 4.0中的类似类.这个类(或者更确切地说是ISet<T>.NET 4.0中的接口)有一个ExceptWith方法也可以完成这项工作.

例:

var set1 = new HashSet<int>() {1, 3, 5, 7, 9};
var set2 = new HashSet<int>() {1, 1, 5, 5, 5, 9};

set1.ExceptWith(set2); // set1 = {3, 7}
Run Code Online (Sandbox Code Playgroud)

当然,这取决于上下文/用法是否更适合这种方法.在大多数情况下,效率优势(就地执行差异操作和使用哈希码)可能是微不足道的.无论哪种方式,请选择.:)