BernardBouree Ответов: 1

Удаление дубликатов объектов в списке


Привет
У меня есть список объектов, объявленных в топоним класс, реализующий интерфейс IEquatable четыре города-химические свойства, CityGeoCode, округа, штата, страны.
Я пытаюсь удалить дубликаты, но безуспешно.

Что я уже пробовал:

var liste = список.Метод groupBy(с =&ГТ; в.Город + С. CityGeoCode + С. Округа + с. Регион + гр.Страны).Выберите (c => c. First ()).Список();
а также

Интерфейс IEnumerable&ЛТ;топоним&ГТ; liste2 = Листэ.Отчетливый().Список();

Оба безрезультатно.

Спасибо за помощь.

1 Ответов

Рейтинг:
12

OriginalGriff

Я бы сделал это так, чтобы использовать Distinct с компаратором:

public class MyClass
    {
    public string Name { get; set; }
    public string Other { get; set; }
    public MyClass(string a, string b)
        {
        Name = a; Other = b;
        }
    }
public class MyClassComp : IEqualityComparer<MyClass>
    {
    public bool Equals(MyClass x, MyClass y)
        {
        return x.Name == y.Name && x.Other == y.Other;
        }

    public int GetHashCode(MyClass obj)
        {
        if (Object.ReferenceEquals(obj, null)) return 0;
        int hashName = obj.Name == null ? 0 : obj.Name.GetHashCode();
        int hashOther = obj.Other == null ? 0 : obj.Other.GetHashCode();
        return hashName ^ hashOther;
        }
    }
Затем я могу использовать это, чтобы сделать то, что вы хотите:
List<MyClass> list = new List<MyClass>();
list.Add(new MyClass("A", "A"));
list.Add(new MyClass("A", "A"));
list.Add(new MyClass("A", "B"));
list.Add(new MyClass("A", "C"));
list.Add(new MyClass("B", "A"));
list.Add(new MyClass("B", "A"));
list.Add(new MyClass("B", "B"));
list.Add(new MyClass("B", "B"));
List<MyClass> newList = list.Distinct(new MyClassComp()).ToList();


Graeme_Grant

5 ЕД :)

BernardBouree

Спасибо, что это работает!
А что, если я хочу иметь список дубликатов?

OriginalGriff

Вот где .Кроме как входит ... :смеяться:

BernardBouree

Ну, я не знаю, что происходит, но это больше не работает.

Вот как я реализовал свой класс сравнения

публичный класс ToponymeGeoDbComp : IEqualityComparer<toponymegeodb>
{
public bool Equals(ToponymeGeoDb x, ToponymeGeoDb y)
{
возвращенная строка.Равняется (X. город.Отделка(), г.Города.Trim (), StringComparison.CurrentCultureIgnoreCase)
&ампер;&ампер; стринги.Равно (x. страна.Отделка(), г.Страны.Trim (), StringComparison.CurrentCultureIgnoreCase);
}

public int GetHashCode(ToponymeGeoDb obj)
{
if (ReferenceEquals(obj, null)) возвращает 0;
var hashCodeCity = obj.Город = = ноль ? 0: ОБЖ. город.GetHashCode();
var hashCodeCountry = obj.Страна = = ноль ? 0: Обь.Страна.GetHashCode();
вернуться hashCodeCity ^ hashCodeCountry;
}
}
И я называю это с помощью
ToponymeGeoDb.ListeToponymesGeoDB = ToponymeGeoDb.ListeToponymesGeoDB.Отдельные(новые ToponymeGeoDbComp()).Список();

Где ListeToponymesGeob объявлен статическим в моем классе ToponymeGeoDb.

Когда я пытаюсь проследить, я обнаруживаю, что метод Equals никогда не вызывается .

Благодарим Вас за помощь.

OriginalGriff

Это делает для меня - скопируйте и вставьте мой код, и вы увидите, - поэтому вам нужно начать с просмотра определения и содержания ListeToponymesGeoDB непосредственно перед тем, как будет сделан ваш отдельный вызов.