Ниже приведены способы использования этого ключевого слова в java:
this
для ссылки на текущие переменные экземпляра класса this()
для вызова конструктор текущего класса this
для возврата текущего экземпляра класса this
в качестве параметра метода https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
Имейте чтение через K. Превосходное сообщение Scott Allen здесь:
И Равенство для Всех... Анонимные Типы
короткий ответ (и я заключаю в кавычки):
Оказывается, что переопределения компилятора C# Равняются и GetHashCode для анонимных типов. Реализация этих двух переопределенных методов использует все общественные собственности на типе, чтобы вычислить хэш-код объекта и протестировать на равенство. Если два объекта того же анонимного типа имеют весь одинаковый, значения для их свойств †“объекты равны.
, Таким образом, полностью безопасно использовать Отличное () метод на запросе, который возвращает анонимные типы.
Я запустил немного теста и нашел, что, если свойства являются типами значения, это, кажется, работает хорошо. Если они не типы значения, то тип должен обеспечить свой собственный, Равняется и реализации GetHashCode для него для работы. Будут работать строки, я думал бы.
Если Alpha
и Bravo
оба наследуются общему классу, то Вы сможете продиктовать равенство, регистрируются в родительском классе путем реализации IEquatable<T>
.
, Например:
public class CommonClass : IEquatable<CommonClass>
{
// needed for Distinct()
public override int GetHashCode()
{
return base.GetHashCode();
}
public bool Equals(CommonClass other)
{
if (other == null) return false;
return [equality test];
}
}
public class DelegateComparer<T> : IEqualityComparer<T>
{
private Func<T, T, bool> _equals;
private Func<T, int> _hashCode;
public DelegateComparer(Func<T, T, bool> equals, Func<T, int> hashCode)
{
_equals= equals;
_hashCode = hashCode;
}
public bool Equals(T x, T y)
{
return _equals(x, y);
}
public int GetHashCode(T obj)
{
if(_hashCode!=null)
return _hashCode(obj);
return obj.GetHashCode();
}
}
public static class Extensions
{
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> items,
Func<T, T, bool> equals, Func<T,int> hashCode)
{
return items.Distinct(new DelegateComparer<T>(equals, hashCode));
}
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> items,
Func<T, T, bool> equals)
{
return items.Distinct(new DelegateComparer<T>(equals,null));
}
}
var uniqueItems=students.Select(s=> new {FirstName=s.FirstName, LastName=s.LastName})
.Distinct((a,b) => a.FirstName==b.FirstName, c => c.FirstName.GetHashCode()).ToList();
Извините за испорченное форматирование ранее
Можно создать собственный Отличный Дополнительный метод, который берет лямбда-выражение. Вот пример
Создайте класс, который происходит из интерфейса IEqualityComparer
public class DelegateComparer<T> : IEqualityComparer<T>
{
private Func<T, T, bool> _equals;
private Func<T, int> _hashCode;
public DelegateComparer(Func<T, T, bool> equals, Func<T, int> hashCode)
{
_equals= equals;
_hashCode = hashCode;
}
public bool Equals(T x, T y)
{
return _equals(x, y);
}
public int GetHashCode(T obj)
{
if(_hashCode!=null)
return _hashCode(obj);
return obj.GetHashCode();
}
}
Затем создайте свой Отличный Дополнительный метод
public static class Extensions
{
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> items,
Func<T, T, bool> equals, Func<T,int> hashCode)
{
return items.Distinct(new DelegateComparer<T>(equals, hashCode));
}
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> items,
Func<T, T, bool> equals)
{
return items.Distinct(new DelegateComparer<T>(equals,null));
}
}
и можно использовать этот метод, находят отличные объекты
var uniqueItems=students.Select(s=> new {FirstName=s.FirstName, LastName=s.LastName})
.Distinct((a,b) => a.FirstName==b.FirstName, c => c.FirstName.GetHashCode()).ToList();
Интересно, что он работает в C #, но не в VB
Возвращает 26 букв:
var MyBet = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ";
MyBet.ToCharArray()
.Select(x => new {lower = x.ToString().ToLower(), upper = x.ToString().ToUpper()})
.Distinct()
.Dump();
Возвращает 52 ...
Dim MyBet = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ"
MyBet.ToCharArray() _
.Select(Function(x) New With {.lower = x.ToString.ToLower(), .upper = x.ToString.ToUpper()}) _
.Distinct() _
.Dump()