EqualityComparer<T>.Default Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает средство сравнения равенства по умолчанию для типа, указанного универсальным аргументом.
public:
static property System::Collections::Generic::EqualityComparer<T> ^ Default { System::Collections::Generic::EqualityComparer<T> ^ get(); };
public static System.Collections.Generic.EqualityComparer<T> Default { get; }
static member Default : System.Collections.Generic.EqualityComparer<'T>
Public Shared ReadOnly Property Default As EqualityComparer(Of T)
Значение свойства
Экземпляр EqualityComparer<T> класса по умолчанию для типа T.
Примеры
В следующем примере создается коллекция, содержащая элементы Box типа, а затем выполняется поиск поля, соответствующего другому FindFirst поле, путем вызова метода дважды.
Первый поиск не указывает ни одного средства сравнения равенства, что означает FindFirst , что используется EqualityComparer<T>.Default для определения равенства полей. Это, в свою очередь, использует реализацию IEquatable<T>.Equals метода в Box классе. Два поля считаются равными, если их размеры одинаковы.
Второй поиск указывает средство сравнения равенства (BoxEqVolume), определяющее равенство по тому. Два поля считаются равными, если их тома одинаковы.
using System;
using System.Collections.Generic;
static class Program
{
static void Main()
{
var redBox = new Box(8, 8, 4);
var blueBox = new Box(6, 8, 4);
var greenBox = new Box(4, 8, 8);
var boxes = new[] { redBox, blueBox, greenBox };
var boxToFind = new Box(4, 8, 8);
var foundByDimension = boxes.FindFirst(boxToFind);
Console.WriteLine($"Found box {foundByDimension} by dimension.");
var foundByVolume = boxes.FindFirst(boxToFind, new BoxEqVolume());
Console.WriteLine($"Found box {foundByVolume} by volume.");
}
}
public static class CollectionExtensions
{
public static T FindFirst<T>(
this IEnumerable<T> collection, T itemToFind, IEqualityComparer<T> comparer = null)
{
comparer = comparer ?? EqualityComparer<T>.Default;
foreach (var item in collection)
{
if (comparer.Equals(item, itemToFind))
{
return item;
}
}
throw new InvalidOperationException("No matching item found.");
}
}
public class BoxEqVolume : EqualityComparer<Box>
{
public override bool Equals(Box b1, Box b2)
{
if (object.ReferenceEquals(b1, b2))
return true;
if (b1 is null || b2 is null)
return false;
return b1.Volume == b2.Volume;
}
public override int GetHashCode(Box box) => box.Volume.GetHashCode();
}
public class Box : IEquatable<Box>
{
public Box(int height, int length, int width)
{
this.Height = height;
this.Length = length;
this.Width = width;
}
public int Height { get; }
public int Length { get; }
public int Width { get; }
public int Volume => Height * Length * Width;
public bool Equals(Box other)
{
if (other is null)
return false;
return this.Height == other.Height && this.Length == other.Length
&& this.Width == other.Width;
}
public override bool Equals(object obj) => Equals(obj as Box);
public override int GetHashCode() => (Height, Length, Width).GetHashCode();
public override string ToString() => $"{Height} x {Length} x {Width}";
}
/* This example produces the following output:
*
Found box 4 x 8 x 8 by dimension.
Found box 8 x 8 x 4 by volume.
*/
Imports System.Collections.Generic
Imports System.Runtime.CompilerServices
Public Class Example
Public Shared Sub Main()
Dim redBox As New Box(8, 8, 4)
Dim blueBox As New Box(6, 8, 4)
Dim greenBox As New Box(4, 8, 8)
Dim boxes As Box() = { redBox, blueBox, greenBox }
Dim boxToFind As New Box(4, 8, 8)
Dim foundByDimension = boxes.FindFirst(boxToFind)
Console.WriteLine($"Found box {foundByDimension} by dimension.")
Dim foundByVolume = boxes.FindFirst(boxToFind, New BoxEqVolume())
Console.WriteLine($"Found box {foundByVolume} by volume.")
End Sub
Private Shared Sub PrintBoxCollection(boxes As Dictionary(Of Box, String))
For Each kvp As KeyValuePair(Of Box, String) In boxes
Console.WriteLine($"{kvp.Key.Height} x {kvp.Key.Length} x {kvp.Key.Width} - {kvp.Value}")
Next
End Sub
End Class
Public Module CollectionExtensions
<Extension()>
Public Function FindFirst(Of T)(
collection As IEnumerable(Of T), itemToFind As T, Optional comparer As IEqualityComparer(Of T) = Nothing)
comparer = If(comparer, EqualityComparer(Of T).Default)
For Each item In collection
If comparer.Equals(item, itemToFind)
Return item
End IF
Next
Throw New InvalidOperationException("No matching item found.")
End Function
End Module
Public Class BoxEqVolume
Inherits EqualityComparer(Of Box)
Public Overrides Function GetHashCode(box As Box) As Integer
Return box.Volume.GetHashCode()
End Function
Public Overrides Function Equals(b1 As Box, b2 As Box) As Boolean
If b1 Is b2 Then
Return True
End If
If b1 Is Nothing OrElse b2 Is Nothing Then
Return False
End If
Return b1.Volume = b2.Volume
End Function
End Class
Public Class Box
Implements IEquatable(Of Box)
Public Sub New(height As Integer, length As Integer, width As Integer)
Me.Height = height
Me.Length = length
Me.Width = width
End Sub
Public ReadOnly Property Height() As Integer
Public ReadOnly Property Length() As Integer
Public ReadOnly Property Width() As Integer
Public ReadOnly Property Volume() As Integer
Get
Return Height * Length * Width
End Get
End Property
Public Overloads Function Equals(other As Box) As Boolean Implements IEquatable(Of Box).Equals
If other Is Nothing Then
Return False
End If
Return Me.Height = other.Height AndAlso Me.Length = other.Length AndAlso
Me.Width = other.Width
End Function
Public Overrides Function Equals(other As Object) As Boolean
Return Equals(TryCast(other, Box))
End Function
Public Overrides Function GetHashCode() As Integer
Return (Height, Length, Width).GetHashCode()
End Function
Public Overrides Function ToString() As String
Return $"{Height} x {Length} x {Width}"
End Function
End Class
' This example produces the following output:
'
' Found box 4 x 8 x 8 by dimension.
' Found box 8 x 8 x 4 by volume.
Комментарии
Свойство Default проверяет, реализует System.IEquatable<T> ли тип T интерфейс и, если да, возвращает объектEqualityComparer<T>, использующий реализацию. В противном случае возвращается значение EqualityComparer<T> , которое использует переопределения Object.Equals и Object.GetHashCode предоставляется T.