2016-03-31 5 views
2

Es gibt zwei Sammlungen: NodesWithCircuitsDown<NetworkDeviceNodeStatus> und RecordedImpairedNodes<NetworkDeviceNodeStatus>.LINQ Vergleichen Sie zwei Sammlungen für mehrere Eigenschaften

NetworkDeviceNodeStatus hat eine NodeId (int) und eine CurrentStatus (enum).

Ich möchte eine dritte Sammlung erstellen NodesWithDifferentImpairment genannt, die jede NetworkDeviceNodeStatus mit einem NodeId enthalten, die in den beiden obigen Sammlungen ist, aber mit einem CurrentStatus, die anders ist.

Unten ist, was ich bisher habe, aber ich habe Probleme beim Verschachteln der Abfragen, um dies zu erreichen.

IEnumerable<NetworkDeviceNodeStatus> NodesWithDifferentImpairment = 
       NodesWithCircuitsDown.Where(x => 
        RecordedImpairedNodes.Select(y => new { y.CurrentStatus, y.NodeId }).Select(y => y.NodeId) 
      ); 

Antwort

3

Versuchen Sie, diese

NodesWithCircuitsDown.Join(RecordedImpairedNodes, 
    node => node.NodeId, 
    node => node.NodeId, 
    (leftNode, rightNode) => new { LeftNode = leftNode, RightNode = rightNode }). 
    Where(pair => pair.LeftNode.CurrentStatus != pair.RightNode.CurrentStatus); 

Um die Knotenpaare mit unterschiedlichen Status zu erhalten, indem die beiden Sätze auf der NodeId Eigenschaft Füge, die Paare zu extrahieren und diese mit unterschiedlichen Status zu filtern.

+0

meinten Sie 'Paar => pair.LeftNode.CurrentStatus = pair.RightNode.CurrentStatus'!? – blgrnboy

+0

@blgrnboy ja, vielen Dank für das Erkennen dieser –

+0

Addiere ich auch '' Select (pair => pair.LeftNode) ', um ein' IEnumerable 'zurück zu bekommen? Das Endergebnis sollte die Elemente in "NodesWithCircuitsDown" zurückgeben, die nicht den gleichen CurrentStatus hatten. – blgrnboy

2

Sie haben sie zu verbinden und dann filtern:

var NodesWithDifferentImpairment = from nwcd in NodesWithCircuitsDown 
            join rin in RecordedImpairedNodes on nwcd.NodId equals rin.NodeId 
            where rin.CurrentStatus != nwcd.CurrentStatus 
            select new NetworkDeviceNodeStatus 
              { 
              CurrentStatus = rin.CurrentStatus, 
              NodeId = rin.NodeId 

              }; 
Verwandte Themen