我在c#中有2个列表。 我需要找到它们之间的切割。 (list1中list2中不存在的所有项目)。我想在linq上使用。 我该怎么办?
答案 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 }
*/