Итак, у меня есть коллекция предметов. Точный тип не важен. Из него я хочу извлечь все уникальные пары пары определенных свойств, таким образом:
myObjectCollection.Select(item=>new
{
Alpha = item.propOne,
Bravo = item.propTwo
}
).Distinct();
Итак, мой вопрос: будет ли Distinct в этом случае использовать объект по умолчанию, равный (что будет бесполезно для меня, поскольку каждый объект является новым), или можно сказать, что он должен делать разные равенства (в данном случае, равные значения Alpha и Bravo => равные случаи)? Есть ли способ достичь этого результата, если он этого не делает?
Ответы:
Прочитайте отличный пост К. Скотта Аллена здесь:
И Равенство для Всех ... Анонимные Типы
Краткий ответ (и я цитирую):
Поэтому совершенно безопасно использовать метод Distinct () в запросе, который возвращает анонимные типы.
источник
Извините за испорченное форматирование ранее
источник
object
иobject
. Если обаobject
этоstring
все еще возвращает повторяющиеся строки. ПопробуйтеFirstName
is typeofobject
и назначьте там жеstring
.Интересно, что это работает в C #, но не в VB
Возвращает 26 букв:
Возвращает 52 ...
источник
Key
ключевое слово в анонимный тип, он.Distinct()
будет работать как задумано (напримерNew With { Key .lower = x.ToString.ToLower(), Key .upper = x.ToString.ToUpper()}
).new {A = b}
естьNew {Key .A = b}
. Неключевые свойства в анонимных классах VB являются изменяемыми, поэтому они сравниваются по ссылке. В C # все свойства анонимных классов неизменны.Я выполнил небольшой тест и обнаружил, что если свойства являются типами значений, похоже, все работает нормально. Если они не являются типами значений, тогда типу необходимо предоставить собственные реализации Equals и GetHashCode, чтобы он работал. Я думаю, что струны будут работать.
источник
Вы можете создать свой собственный метод Distinct Extension, который принимает лямбда-выражения. Вот пример
Создайте класс, производный от интерфейса IEqualityComparer
Затем создайте свой метод Distinct Extension
и вы можете использовать этот метод, чтобы найти отдельные предметы
источник
object
иobject
. Если обаobject
этоstring
все еще возвращает повторяющиеся строки. ПопробуйтеFirstName
is typeofobject
и назначьте там жеstring
.Если
Alpha
иBravo
оба наследуют от общего класса, вы сможете диктовать проверку на равенство в родительском классе путем реализацииIEquatable<T>
.Например:
источник
Привет, у меня та же проблема, и я нашел решение. Вы должны реализовать интерфейс IEquatable или просто переопределить методы (Equals & GetHashCode). Но это не уловка, уловка в методе GetHashCode. Вы не должны возвращать хеш-код объекта вашего класса, но вы должны возвращать хэш свойства, которое вы хотите сравнить таким образом.
Как вы видите, у меня есть класс с именем person, который получил 3 свойства (Name, Age, IsEgyptian «Потому что я есть»). В GetHashCode я вернул хэш свойства Name, а не объекта Person.
Попробуйте, и это будет работать ISA. Спасибо, Модер Садик
источник
public override int GetHashCode() { return this.Name.GetHashCode() ^ this.Age.GetHashCode() ^ this.IsEgyptian.GetHashCode(); }
Чтобы это работало в VB.NET, вам нужно указать
Key
ключевое слово перед каждым свойством в анонимном типе, вот так:Я боролся с этим, я думал, что VB.NET не поддерживает этот тип функций, но на самом деле это так.
источник