Was ist der effizienteste Weg, um eine Methode zu schreiben, die n Listen vergleicht und alle Werte zurückgibt, die nicht in allen Listen erscheinen, so dass
%Vor%so dass
lists.GetNonShared ();
gibt 1, 5, 8, 9, 10
zurückIch hatte
%Vor%Aber ich war mir nicht sicher, ob das effizient war. Ordnung spielt keine Rolle. Danke!
EDIT: Ich denke, ich würde so darüber nachdenken ...
Sie möchten die Vereinigung aller Listen abzüglich der Schnittmenge aller Listen. Das ist effektiv das, was Ihr Original tut, wobei Except
die Operation "set" von Union
trotz doppelter Eingaben verlassen muss. In diesem Fall verdächtig könntest du das effizienter machen, indem du einfach zwei HashSet
s aufbaust und alle Arbeiten vor Ort ausführst:
Beachten Sie, dass dies nun eifrig, nicht verzögert ist.
Hier ist eine alternative Option:
%Vor%Wenn es möglich ist, dass eine Liste dasselbe Element mehr als einmal enthält, möchten Sie einen eindeutigen Anruf dort:
%Vor%EDIT: Jetzt habe ich das korrigiert, ich verstehe deinen Originalcode ... und ich vermute, dass ich etwas besseres finden kann ... denke ...
Ich denke, dass Sie einen Zwischenschritt erstellen müssen, der alle Elemente findet, die für alle Listen gemeinsam sind. Dies ist leicht mit der Set-Logik zu tun - es ist nur der Satz von Elementen in der ersten Liste, der mit dem Satz von Elementen in jeder nachfolgenden Liste geschnitten wird. Ich denke nicht, dass dieser Schritt in LINQ machbar ist.
%Vor%Tags und Links c# linq array-algorithms