Удаление почти дубликатов из вложенного списка - PullRequest
1 голос
/ 02 мая 2020

Если у меня есть следующие подсписки, как я могу удалить «дубликаты», чтобы у меня остались только L1, L2 и L3? Я не возражаю против того, какой вариант останется, пока нет дубликатов.

List<List<string>> mylist = new List<List<string>>();
List<string> L1 = new List<string> { "a", "b", "c" };
List<string> L2 = new List<string> { "d", "e", "f" };
List<string> L3 = new List<string> { "g", "h", "i" };
List<string> L4 = new List<string> { "c", "a", "b" };
List<string> L5 = new List<string> { "a", "c", "b" };
List<string> L6 = new List<string> { "f", "d", "e" };

Стоит отметить, что я удаляю дубликаты, чтобы повысить производительность в другой части моей программы, поэтому что-то слишком интенсивное не будет уместным. Спасибо!

1 Ответ

2 голосов
/ 02 мая 2020

вы можете использовать Linq, применив функцию Distinct с пользовательским компаратором, например следующий код:

1 - Создать пользовательский шаблон c для компаратора List<T>:

public class GenericComparer<T> : IEqualityComparer<List<T>>
{
    public bool Equals(List<T> x, List<T> y)
    {
        return x.Count == y.Count && x.All(xx => y.Contains(xx));
    }

    public int GetHashCode(List<T> obj)
    {
        int hashCode = 0;

        foreach(T str in obj)
        {
            hashCode ^= str.GetHashCode();
        }

        return hashCode;
    }
}

2 - вызов функции Distinct с помощью StringListComparer, например:

List<List<string>> mylist = new List<List<string>>()
{
    new List<string> { "a", "b", "c" },
    new List<string> { "d", "e", "f" },
    new List<string> { "g", "h", "i" },
    new List<string> { "c", "a", "b" },
    new List<string> { "a", "c", "b" },
    new List<string> { "f", "d", "e" },
};

var result = mylist.Distinct(new GenericComparer<string>()).ToList();

3 - демонстрация

foreach(List<string> strList in result)
{
    Console.WriteLine(string.Join(",", strList));
}

4- результат

a,b,c
d,e,f
g,h,i

Если у вас есть список целых чисел, вы можете вызвать метод Distinct, например:

var result1 = mylist1.Distinct(new GenericComparer<int>()).ToList();

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...