Удалить дубликаты записей из 2D-списка в CSharp - PullRequest
0 голосов
/ 04 марта 2020

Как удалить дубликаты записей из 2D-списка в C#. вот мой код

HashSet<List<int>> set =  new HashSet<List<int>>();
set.Add(new List<int>(){1,-2,-1,2});
set.Add(new List<int>(){3,-2,1,1});
set.Add(new List<int>() {1,-2,-1,2}); //duplicate entry

но в результате, который я получаю, есть повторяющаяся запись {{1,-2,-1,2},{3,-2,1,1},{1,-2,-1,2}} Я также пытался использовать set.Distinct().ToList(), но я все еще получаю дубликаты в моем результате.

пожалуйста, кто-то может указать мне аккуратный способ сделать это с помощью HashSet. Я не хочу сравнивать каждую последовательность в списке, потому что это добавляет некоторую временную сложность моему коду.

Спасибо за вашу помощь в ожидании.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Вы можете создать реализацию IEqualityComparer<List<int>> (и использовать метод SequenceEqual для равенства списка)

public class ListComparer : IEqualityComparer<List<int>>
{
    public bool Equals(List<int> x, List<int> y)
    {
        return x.SequenceEqual(y);
    }

    public int GetHashCode(List<int> obj)
    {
        return obj.Aggregate(19, (current, item) => current ^ item.GetHashCode());
    }
}

И передать его Distinct метод

var set = new HashSet<List<int>>
{
    new List<int>() {1, -2, -1, 2}, new List<int>() {3, -2, 1, 1}, new List<int>() {1, -2, -1, 2}
};

var result = set.Distinct(new ListComparer());

Позволяет удалить {1,-2,-1,2} дублированную запись.

Вы также можете передать экземпляр ListComparer в конструктор HashSet и получить избавиться от добавления дублирующих списков

var set = new HashSet<List<int>>(new ListComparer())
{
    new List<int>() {1, -2, -1, 2}, new List<int>() {3, -2, 1, 1}, new List<int>() {1, -2, -1, 2}
};

В приведенном выше примере set будет содержать только два элемента без дублированных списков

0 голосов
/ 04 марта 2020

вы можете создать реализацию IEqualityComparer и передать ее в функцию Distinct.

в вашей реализации IEqualityComparer упорядочить список и проверить, если есть (или пересекаются), если они есть, тогда два списка не равны ,

вы также можете выполнить простое l oop через каждый список и проверить наличие элемента в том же индексе, если количество одинаковых ключей равно длине вашего списка, а затем исключить один из них.

...