除了
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));
}
}
輸出:
光明節