LINQ Select Distinct с анонимными типами

Ниже приведены способы использования этого ключевого слова в java:

  1. Использование ключевого слова this для ссылки на текущие переменные экземпляра класса
  2. Использование this() для вызова конструктор текущего класса
  3. Использование ключевого слова this для возврата текущего экземпляра класса
  4. Использование ключевого слова this в качестве параметра метода

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

143
задан GWLlosa 12 February 2009 в 21:46
поделиться

6 ответов

Имейте чтение через K. Превосходное сообщение Scott Allen здесь:

И Равенство для Всех... Анонимные Типы

короткий ответ (и я заключаю в кавычки):

Оказывается, что переопределения компилятора C# Равняются и GetHashCode для анонимных типов. Реализация этих двух переопределенных методов использует все общественные собственности на типе, чтобы вычислить хэш-код объекта и протестировать на равенство. Если два объекта того же анонимного типа имеют весь одинаковый, значения для их свойств †“объекты равны.

, Таким образом, полностью безопасно использовать Отличное () метод на запросе, который возвращает анонимные типы.

180
ответ дан Matt Hamilton 12 February 2009 в 21:46
поделиться

Я запустил немного теста и нашел, что, если свойства являются типами значения, это, кажется, работает хорошо. Если они не типы значения, то тип должен обеспечить свой собственный, Равняется и реализации GetHashCode для него для работы. Будут работать строки, я думал бы.

4
ответ дан tvanfosson 12 February 2009 в 21:46
поделиться

Если 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];
    }
}
0
ответ дан ern 12 February 2009 в 21:46
поделиться
  • 1
    Можно добавить персональные данные в профиле. Аватар уже показывает Ваше имя на этом сообщении. – nhahtdh 5 September 2013 в 06:22
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();

Извините за испорченное форматирование ранее

14
ответ дан 23 November 2019 в 22:44
поделиться

Можно создать собственный Отличный Дополнительный метод, который берет лямбда-выражение. Вот пример

Создайте класс, который происходит из интерфейса 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();
2
ответ дан 23 November 2019 в 22:44
поделиться

Интересно, что он работает в 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()
5
ответ дан 23 November 2019 в 22:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: