Как удалить дубликаты пар в списке - PullRequest
0 голосов
/ 29 мая 2018

Я получил список с парами целых чисел.Как мне удалить пары, если они дубликаты?Отличное не сработает, потому что пара может быть (2, 1) вместо (1, 2).

Мой список выглядит так:

1, 2
2, 3
3, 1
3, 2
2, 4
4, 3

... Мне не нужно(2, 3) и (3, 2)

Я сделал public struct FaceLine с public int A и B, затем var faceline = new List<FaceLine>();.

Я новичок в C # ипотерял.

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

Если вы счастливы, используя общее расширение DistinctBy Linq ( доступно через NuGet ), вы можете сделать это довольно просто, например:

var result = list.DistinctBy(x => (x.A > x.B) ? (x.A, x.B) : (x.B, x.A));

Пример консольного приложения:

using System;
using System.Collections.Generic;
using MoreLinq;

namespace Demo
{
    class Test
    {
        public Test(int a, int b)
        {
            A = a;
            B = b;
        }

        public readonly int A;
        public readonly int B;

        public override string ToString()
        {
            return $"A={A}, B={B}";
        }
    }

    class Program
    {
        static void Main()
        {
            var list = new List<Test>
            {
                new Test(1, 2),
                new Test(2, 3),
                new Test(3, 1),
                new Test(3, 2),
                new Test(2, 4),
                new Test(4, 3)
            };

            var result = list.DistinctBy(x => (x.A > x.B) ? (x.A, x.B) : (x.B, x.A));

            foreach (var item in result)
                Console.WriteLine(item);
        }
    }
}
0 голосов
/ 29 мая 2018

Вы можете использовать пользовательский IEqualityComparer<FaceLine>:

public class UnorderedFacelineComparer : IEqualityComparer<FaceLine>
{
    public bool Equals(FaceLine x, FaceLine y)
    {
        int x1 = Math.Min(x.A, x.B);
        int x2 = Math.Max(x.A, x.B);
        int y1 = Math.Min(y.A, y.B);
        int y2 = Math.Max(y.A, y.B);
        return x1 == y1 && x2 == y2;
    }

    public int GetHashCode(FaceLine obj)
    {
        return obj.A ^ obj.B;
    }
}

Тогда запрос был очень прост:

var comparer = new UnorderedFacelineComparer();
List<FaceLine> nonDupList = faceLine
    .GroupBy(fl => fl, comparer)
    .Where(g => g.Count() == 1)
    .Select(g => g.First())
    .ToList();

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

List<FaceLine> nonDupList = faceLine
    .GroupBy(fl => fl, comparer)
    .Select(g => g.First())
    .ToList();
0 голосов
/ 29 мая 2018

Использование Linq:

List<List<int>> data = new List<List<int>>() {
    new List<int>() {1, 2},
    new List<int>() {2, 3},
    new List<int>() {3, 1},
    new List<int>() {3, 2},
    new List<int>() {2, 4},
    new List<int>() {4, 3}
};

List<List<int>> results = 
  data.Select(x => (x.First() < x.Last()) 
     ? new { first = x.First(), last = x.Last() } 
     : new { first = x.Last(), last = x.First() })
  .GroupBy(x => x)
  .Select(x => new List<int>() { x.First().first, x.First().last }).ToList();
0 голосов
/ 29 мая 2018

Сформируйте набор наборов, и вы получите функциональность бесплатно (каждый меньший набор содержит ровно два целых числа).

...