Linq ruft Werte ab, die nicht auf mehrere Listen verteilt sind

8

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ück

Ich hatte

%Vor%

Aber ich war mir nicht sicher, ob das effizient war. Ordnung spielt keine Rolle. Danke!

    
Brad Urani 15.09.2011, 19:05
quelle

4 Antworten

5
%Vor%     
mironych 15.09.2011, 19:25
quelle
2

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:

%Vor%

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 ...

    
Jon Skeet 15.09.2011 19:13
quelle
0

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%     
Robert Rossney 15.09.2011 19:50
quelle
0
%Vor%

// Verwenden Sie HashSet und SymmetricExceptWith für .net & gt; = 4.5

    
SKG 20.06.2015 12:50
quelle

Tags und Links