Objekte mehrere Liste miteinander Vergleichen

  • C#

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Objekte mehrere Liste miteinander Vergleichen

    Hallo,

    ich habe immer wieder eine undefinierte Anzahl von Listen wie z.B.

    C#-Quellcode

    1. public IEnumerable<RecipeComparerMachine> AllRecipeComparer { get; private set; }


    Jedes Element der Liste enthält eine Anzahl unterschiedlicher Objekte.
    Ich benötige nun einen Vergleich eines Objektes über alle Listen (mindestens zwei Listen höchstens x Listen)

    Mein einfach gestrickter Code sieht so aus - läuft.
    Frage:
    Fällt jemand ein einfacherer Weg ein ? z.B. Linq ?

    C#-Quellcode

    1. int count = -1;
    2. bool Result = true;
    3. // Anzahl der Komponenten
    4. foreach(RecipeComparerMachine recipeComparerMachine in this.AllRecipeComparer)
    5. {
    6. if (count == -1)
    7. {
    8. count = recipeComparerMachine.ComponentRecipeCompareModels.Count;
    9. }
    10. else
    11. {
    12. if (count != recipeComparerMachine.ComponentRecipeCompareModels.Count)
    13. {
    14. Result = false;
    15. break;
    16. }
    17. }
    18. }


    Gruss

    mikeb69
    Mit Linq:

    C#-Quellcode

    1. return list.All(x=>x.Count == list.First().Count);

    Für alle, die mit Linq (noch) nichts anfangen konnten, die Zeile heißt in natürlicher Sprache:
    ​GIb zurück, ob die Länge aller Listen der Länge der ersten Liste entspricht.

    Und das ist ein hinreichendes Kriterium.

    Oder habe ich dich falsch verstanden? Dir ging's nur um die Länge deiner Listen, oder?
    @X-Zat

    Dir ging's nur um die Länge deiner Listen, oder?

    Das war nur ein Beispiel.

    Im Prinzip hab ich Objekte jeder Art wie oben beschrieben zu prüfen.
    Mal sehen wie weit ich mit deinem Ansatz komme - sieht auf jeden Fall erst einmal gut aus.

    Ein anderes Beispiel sieht so aus

    C#-Quellcode

    1. // Vergleich Materialien
    2. IEnumerable<recipesRecipeMaterial> resultMaterial = null;
    3. foreach (RecipeComparerMachine recipeComparerMachine in this.AllRecipeComparer)
    4. {
    5. if (resultMaterial == null)
    6. {
    7. resultMaterial = recipeComparerMachine.Materials.Select(x => x);
    8. }
    9. else
    10. {
    11. IEnumerable<recipesRecipeMaterial> tempMaterial = recipeComparerMachine.Materials.Select(x => x);
    12. if (!resultMaterial.SequenceEqual(tempMaterial))
    13. {
    14. Result = false;
    15. break;
    16. }
    17. }
    18. }


    Gruss

    mikeb69
    Achso!

    Also dann sollte das hier eine Lösung darstellen:

    C#-Quellcode

    1. ​if (this.AllRecipeComparer.Count == 0) //Behandle Fall, dass AllRecipeComparer leer ist
    2. return true;
    3. var first = this.AllRecipeComparer.First(); //Hole erstes Element
    4. return
    5. this.AllRecipyComparer.Skip(1) //Überspringe erstes Element (da bereits in first enthalten)
    6. .All(rcm => rcm.Materials.Count > 0 && first.Materials.SequenceEqual(rcm.Materials)); //Überprüfe ob alle folgenden Elemente nicht leer sind und dieselben Materialien wie first beinhalten


    Zunächst würde ich überprüfen, ob denn eine leere Liste vorhanden ist, sonst werden folgend Ausnahmen geworfen ;).
    Man sollte bei IEnumerables darauf achten, nur einmal darüberzuiterieren, sofern es möglich ist. Count, First und All iterieren je einmal.
    Die folgende Funktion kann auf beliebige Auflistungen angewendet werden:

    C#-Quellcode

    1. public static bool AllItemsAreTheSame<T>(this IEnumerable<T> Target, Func<T, T, bool> EqualityComparer)
    2. {
    3. using (var Enumerator = Target.GetEnumerator())
    4. {
    5. if (!Enumerator.MoveNext()) return true;
    6. var First = Enumerator.Current;
    7. while (Enumerator.MoveNext())
    8. {
    9. if (!EqualityComparer(Enumerator.Current, First)) return false;
    10. }
    11. }
    12. return true;
    13. }

    Hier ein Beispiel für Auflistungen von Integern:

    C#-Quellcode

    1. Console.WriteLine(new int[] { }.AllItemsAreTheSame((Left, Right) => Left == Right));
    2. Console.WriteLine(new int[] { 1 }.AllItemsAreTheSame((Left, Right) => Left == Right));
    3. Console.WriteLine(new int[] { 1, 1 }.AllItemsAreTheSame((Left, Right) => Left == Right));
    4. Console.WriteLine(new int[] { 1, 2 }.AllItemsAreTheSame((Left, Right) => Left == Right));

    Und hier ein Beispiel für RecipeComparerMachine Dinger:

    C#-Quellcode

    1. Console.WriteLine(new RecipeComparerMachine[] { }.AllItemsAreTheSame((Left, Right) => Left.Materials.SequenceEqual(Right.Materials)));
    2. Console.WriteLine(new RecipeComparerMachine[] { new RecipeComparerMachine(1, 2, 3) }.AllItemsAreTheSame((Left, Right) => Left.Materials.SequenceEqual(Right.Materials)));
    3. Console.WriteLine(new RecipeComparerMachine[] { new RecipeComparerMachine(1, 2, 3), new RecipeComparerMachine(1, 2, 3) }.AllItemsAreTheSame((Left, Right) => Left.Materials.SequenceEqual(Right.Materials)));
    4. Console.WriteLine(new RecipeComparerMachine[] { new RecipeComparerMachine(1, 2, 3), new RecipeComparerMachine(1, 2, 3, 4, 5) }.AllItemsAreTheSame((Left, Right) => Left.Materials.SequenceEqual(Right.Materials)));
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils