获取list1中list2中不存在的所有项目

时间:2014-01-20 09:11:25

标签: c#

我在c#中有2个列表。 我需要找到它们之间的切割。 (list1中list2中不存在的所有项目)。我想在linq上使用。 我该怎么办?

2 个答案:

答案 0 :(得分:2)

您可以使用Enumerable.Except方法。

  

产生两个序列的集合差异。

来自 MSDN 页面的示例;

double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2);

foreach (double number in onlyInFirstSet)
         Console.WriteLine(number);

/*
This code produces the following output:

2
2.1
2.3
2.4
2.5
*/

正如Tim Schmelter pointed ,如果要在自定义数据类型上使用此方法,则需要实现IEqualityComparer<T>接口,并且需要提供{{1 }和GetHashCode方法..

答案 1 :(得分:1)

Enumerable中的LINQ函数很不错,但有时你应该确保使用正确的数据结构,通常包括相关的操作。

在这种情况下,听起来您正在使用sets。为了提高效率,通常会使用hash tables来实现这些功能。 .NET使用HashSet<T>提供了这样的数据结构。

用于获取一组与另一组之间差异的函数(这就是您所要求的)是HashSet<T>.ExceptWith()

该页面的示例如下:

static void Main()
{
    HashSet<int> lowNumbers = new HashSet<int>();
    HashSet<int> highNumbers = new HashSet<int>();

    for (int i = 0; i < 6; i++)
    {
        lowNumbers.Add(i);
    }

    for (int i = 3; i < 10; i++)
    {
        highNumbers.Add(i);
    }

    Console.Write("lowNumbers contains {0} elements: ", lowNumbers.Count);
    DisplaySet(lowNumbers);

    Console.Write("highNumbers contains {0} elements: ", highNumbers.Count);
    DisplaySet(highNumbers);

    Console.WriteLine("highNumbers ExceptWith lowNumbers...");
    highNumbers.ExceptWith(lowNumbers);

    Console.Write("highNumbers contains {0} elements: ", highNumbers.Count);
    DisplaySet(highNumbers);
}
/* This example provides output similar to the following:
 * lowNumbers contains 6 elements: { 0 1 2 3 4 5 }
 * highNumbers contains 7 elements: { 3 4 5 6 7 8 9 }
 * highNumbers ExceptWith lowNumbers...
 * highNumbers contains 4 elements: { 6 7 8 9 }
 */