0
votes

Comment distinct pour une liste de liste à l'aide de LINQ?

Dans mon cas, j'ai une liste de points que je souhaite supprimer les listes de points en double à l'aide de Linq de manière similaire à la manière dont les travaux distincts de la liste des articles habituellement.

Comment pourrais-je le faire? Ici, il s'agit d'un extrait de code pour mieux comprendre mon problème xxx

merci


6 commentaires

Eh bien, vous devrez réellement mettre en œuvre l'interface Iequatable ..?


Pourquoi votre point contient-il une liste de listes?


"Je veux jeter les listes de points en double" C'est l'interprétation ombragée. Vous voulez dire une liste de points uniques? Vous voulez dire des listes uniques des points?


Essayez en suivant: Boolean public Equals (point autre) {return (this.x == autre.x) && (this.y == autre.y); }


Je suggérerais d'ajouter un exemple d'entrée avec la sortie attendue pour rendre votre question plus claire.


Une raison pour laquelle vous utilisez votre propre point au lieu d'une structure existante? par exemple. docs.microsoft.com/en-us/dotnet/api/ système.Drawing.point


4 Réponses :


-1
votes

Si vous avez un code comme celui-ci xxx pré>

alors ce code fonctionnerait p> xxx pré>

supposant que les points sont définis comme celui-ci p>

var points = List<List<Point>>();


1 commentaires

Je crois que OP veut utiliser distinct contre une liste > , pas seulement Liste



2
votes

Premier, en réalité implémenter IEQUABLE:

var results = pointLists.Distinct(new ListPointComparer());
// Outputs only 2 lists, with pointsA and pointsB combined.


0 commentaires

-1
votes

linq distinct peut utiliser un iéqualitalcomparer code>

Vous pouvez implémenter une nouvelle classe implémentant cette interface, puis générer des listes distinctes. P>

Voici une implémentation d'un complet Point codé Implémentation Iequatable code> et implémenté IéqualityComparer code> et une classe de test. P>

La classe de test est "simple" distincte sur chaque liste. Si vous avez besoin d'un distinct plus complexe, tel que des points distincts dans toutes les listes, postez vos exigences fonctionnelles et je peux voir ce que je peux faire. P>

    public struct Point : IEquatable<Point>
{
    public Point(int x, int y) : this()
    {
        X = x;
        Y = y;
    }

    public int X { get; set; }
    public int Y { get; set; }

    public bool Equals(Point other)
    {
        if (other.X == X && other.Y == Y)
            return true;

        return false;
    }

    public override bool Equals(object obj)
    {
        if (obj != null && obj.GetType() == typeof(Point))
            return Equals((Point)obj);

        return base.Equals(obj);
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(X, Y);
    }

    public int GetHashCode(Point obj)
    {
        return obj.GetHashCode();
    }
}

public class PointComparer : IEqualityComparer<Point>
{
    public bool Equals(Point x, Point y)
    {
        return x.Equals(y);
    }

    public int GetHashCode(Point obj)
    {
        return obj.GetHashCode();
    }
}

public class Tester
{
    public static List<List<Point>> Dist(List<List<Point>> points)
    {
        var results = new List<List<Point>>();
        var comparer = new PointComparer();

        foreach (var lst in points)
        {
            results.Add(lst.Distinct(comparer).ToList());
        }

        return results;
    }
}


0 commentaires

1
votes

Vous pouvez utiliser HASHSET Cette classe fournit des opérations définies de haute performance. Un ensemble est une collection qui ne contient aucun élément en double et dont les éléments ne sont pas en ordre particulier

Exemple: P>

    public struct Point 
    {
        public HashSet<int> coordinateX;
        public HashSet<int> coordinateY;

        public Point(HashSet<int> a, HashSet<int> b) 
        {
            coordinateX = a;
            coordinateY = b;
        }
    }
    static void Main(string[] args)
    {
        var set1 = new HashSet<int>() { 2, 3, 4, 6, 8 };
        var set2 = new HashSet<int>() { 67, 31, 1, 3, 5 };

        var points = new List<List<Point>>();

        points.Add(new List<Point>() { new Point(set1, set2) });

        //TODO
    }


0 commentaires