除了
Except 方法返回第一个集合中包含但未包含在第二个集合中的项集。默认 IEqualityComparer
用于比较两组中的项目。有一个重载接受 IEqualityComparer
作为参数。
例:
int[] first = { 1, 2, 3, 4 };
int[] second = { 0, 2, 3, 5 };
IEnumerable<int> inFirstButNotInSecond = first.Except(second);
// inFirstButNotInSecond = { 1, 4 }
输出:
1
4
在这种情况下,.Except(second)
排除了数组 second
中包含的元素,即 2 和 3(0 和 5 不包含在 first
数组中并被跳过)。
请注意,Except
意味着 Distinct
(即,它删除重复的元素)。例如:
int[] third = { 1, 1, 1, 2, 3, 4 };
IEnumerable<int> inThirdButNotInSecond = third.Except(second);
// inThirdButNotInSecond = { 1, 4 }
输出:
1
4
在这种情况下,元素 1 和 4 仅返回一次。
实施 IEquatable
或提供的功能的 IEqualityComparer
将允许使用不同的方法的元素进行比较。请注意,还应该重写 GetHashCode
方法,以便根据 IEquatable
实现为 object
返回相同的哈希码。
使用 IEquatable 的示例:
class Holiday : IEquatable<Holiday>
{
public string Name { get; set; }
public bool Equals(Holiday other)
{
return Name == other.Name;
}
// GetHashCode must return true whenever Equals returns true.
public override int GetHashCode()
{
//Get hash code for the Name field if it is not null.
return Name?.GetHashCode() ?? 0;
}
}
public class Program
{
public static void Main()
{
List<Holiday> holidayDifference = new List<Holiday>();
List<Holiday> remoteHolidays = new List<Holiday>
{
new Holiday { Name = "Xmas" },
new Holiday { Name = "Hanukkah" },
new Holiday { Name = "Ramadan" }
};
List<Holiday> localHolidays = new List<Holiday>
{
new Holiday { Name = "Xmas" },
new Holiday { Name = "Ramadan" }
};
holidayDifference = remoteHolidays
.Except(localHolidays)
.ToList();
holidayDifference.ForEach(x => Console.WriteLine(x.Name));
}
}
输出:
光明节