2016-07-13 8 views
0
foreach (VXmlNode.VObject func in GetObjectsByPath("Function")) 
{ 
    BooleanExpression fexpr = func.GetPresenceCondition(); 

    foreach (VXmlNode.VObject Objectparameter in func.GetObjectsByPath("Parameter") && func.GetObjectsByPath("Return")) 
    { 
     BooleanExpression parapresenceCondition = Objectparameter.GetPresenceCondition(); 
    } 
} 

Wie Sie oben im Code sehen können, möchte ich so etwas wie:Wie FürJeden verwenden, um mit zwei Bedingungen in C#

foreach (VXmlNode.VObject Objectparameter in func.GetObjectsByPath("Parameter") && func.GetObjectsByPath("Return")) 

in meinem Code, Und Zustand nicht da drinnen ein foreach sein kann Schleife, aber kann mir jemand das Äquivalent davon sagen. Kann jemand bitte Vorschläge machen, wie es geht? Ich versuche, sowohl die XML-Objekte zu bekommen als auch etwas damit zu tun. Jede Hilfe wäre willkommen. Vielen Dank.

+1

Können Sie erklären, was Sie bitte tun wollen? Verfügen Sie über zwei Listen mit entsprechenden Elementen und möchten Sie diese beiden Schritt für Schritt durchlaufen? Oder gibt es zwei Parameter für jede Funktion? Es ist nicht sehr klar, was Sie wollen. Vielleicht zeigen Sie einige Beispiele, was Sie tun möchten? Wenn man bedenkt, dass die foreach keine Booleans macht, ist es unklar, was man mit einem AND erreichen will ... – Chris

+1

Ein 'foreach' hat _no_ condition, also wie könnte es sogar _two_ haben? 'func.GetObjectsByPath (" Parameter ") && func.GetObjectsByPath (" Parameter ")' sieht so aus, als ob Sie versuchen, die beiden Listen zu intersezieren, aber das macht keinen Sinn, weil Sie zwei identische Listen intersezieren würden. Bitte klären Sie, was das erwartete Ergebnis dieses Ausdrucks sein sollte. Oder noch besser: Erstelle ein [minimales Beispiel] (http://stackoverflow.com/help/mcve). –

+0

Es gibt eine Funktion, die Objekte über Pfade bekommt, ich muss nur die Art angeben, die ich möchte. Kind ist ein String zB: Parameter, Return. Es gibt eine Funktion Node (Function), wo ich den Parameter-Knoten und den Return-Knoten bekommen möchte, der darin ist und etwas damit machen. – user5440565

Antwort

1

Verwenden TakeWhile

Aus der Dokumentation:

string[] fruits = { "apple", "passionfruit", "banana", "mango", 
        "orange", "blueberry", "grape", "strawberry" }; 

IEnumerable<string> query = 
      fruits.TakeWhile((fruit, index) => fruit.Length >= index); 

foreach (string fruit in query) 
{ 
    Console.WriteLine(fruit); 
} 

So können Sie mehr als eine Bedingung hinzufügen fruit.Length >= index && fruit != "banana"

+0

Es gibt eine Funktion, die Objekte über Pfade bekommt, ich muss nur die Art angeben, die ich möchte. Kind ist ein String zB: Parameter, Return. Es gibt eine Funktion Node (Function), wo ich den Parameter Node und den Return Node, der darin ist, holen und etwas damit machen möchte. – user5440565

+0

Was bedeutet die Sammlung, die ich durchlaufen sollte, ist die Kombination der zwei Funktionen? oder ich bin falsch – Sherlock

+0

Ja, weil ich beide Knotenobjekte habe (Parameter, Return) Ich möchte einige Werte (Parameter: void, return: int) darin kombinieren und dann etwas zurückgeben, wenn es die Werte hat, die ich suche. z. B. int user5440565

1

Was Sie wollen, ist das Zip-Methode

var integers = new [] { 1, 2, 3, 4 }; 
var strings = new [] { "one", "two", "three", "four" }; 

var combined = integers.Zip(strings, (n, w) => new { Number = n, Word = w }); 
foreach(var myObj in combined) 
{ 
    //Use it 
} 
+0

Es gibt eine Funktion, die Objekte durch Pfade bekommt, muss ich nur die Art angeben, die ich will. Kind ist ein String zB: Parameter, Return. Es gibt eine Funktion Node (Function), wo ich den Parameter Node und den Return Node, der darin ist, holen und etwas damit machen möchte. – user5440565

1

Nicht ganz sicher, was du versuchst zu tun. Der Code macht keinen Sinn.

func.GetObjectsByPath("Parameter") && func.GetObjectsByPath("Parameter") 

Sie haben den gleichen Code auf beiden Seiten des &&. Ist das korrekt?

Das heißt, Sie könnten versuchen, LINQ SelectMany verwenden, um eine Hierarchie oder Zip flacher wie Luca vorgeschlagen.

UPDATE:

könnten Sie Concat oder Union nutzen. Zip wird auch den Trick machen. Hängt von Ihrem gewünschten Ergebnis ab.

foreach(var item in func.GetOBjectsByPath("Par1").Concat(func.GetOBjectsByPath("Par2")) 
+0

Es gibt eine Funktion, die Objekte über Pfade bekommt, ich muss nur die Art angeben, die ich möchte. Kind ist ein String zB: Parameter, Return. Es gibt eine Funktion Node (Function), wo ich den Parameter Node und den Return Node, der darin ist, holen und etwas damit machen möchte. – user5440565

+0

Siehe meine aktualisierte Antwort – Michael

1

Ihre Frage ist vage ein, z.B. wie kann

func.GetObjectsByPath("Parameter") 

a Zustand sein (d.h. kehrt true oder false), während eine Sammlung wobei über foreach Schleife aufzuzählen? Trotzdem schlage ich Linq mit seinen Where Filtern:

var source = GetObjectsByPath("Function") 
    .Where(func => func.GetObjectsByPath("Parameter")) // condition on func 
    .SelectMany(func => func.GetObjectsByPath("Parameter")) // get all parameters flatten 
    .Select(prm => prm.GetPresenceCondition()); 

    foreach (BooleanExpression parapresenceCondition in source) { 
    ... 
    } 

Bitte, dass Ankündigung können Sie so viele Bedingungen setzen, wie Sie wollen:

var source = GetObjectsByPath("Function") 
    .Where(func => ...) // condition on func 
    .Where(func => ...) // && another condition on func 
    .SelectMany(func => func.GetObjectsByPath("Parameter")) // get all parameters flatten 
    .Where(prm => ...) // condition on parameter 
    .... 
+0

Sie noch einmal: 3 Ich werde meine Antwort wieder löschen: 3 – Sherlock

+0

Einer ist 'GetObjectsByPath (" Parameter ")'. Zweitens ist 'func.GetObjectsByPath (" Parameter ")', also könnten sie Methoden verschiedener Klassen sein. Ich mache hier eine harte Vermutung, obwohl ich zustimme, dass es verwirrend ist. – user3185569

+0

@ user3185569: Ich versuche 'in func.GetObjectsByPath (" Parameter ") && func.GetObjectsByPath (" Parameter ")' im Code der Frage zu entschlüsseln. Wenn der erste 'func.GetObjectsByPath (" Parameter ")' eine * Sammlung * ist, dann kann die zweite (nach '&&') kaum eine Bedingung sein. –

0

Es sieht aus wie Sie einfach die ausgeführt werden soll statment in Ihrem foreach Schleife, dh

BooleanExpression parapresenceCondition = Objectparameter.GetPresenceCondition(); 

... für alle alle Elemente Objectparameter, die von func.GetObjectsByPath("Parameter")undfunc.GetObjectsByPath("Return") zurückgegeben werden.

Dafür einfach kombinieren müssen (concatenate) beide Listen und iterieren der Ergebnisliste wie folgt:

var parameters = func.GetObjectsByPath("Parameter"); 
var results = func.GetObjectsByPath("Return"); 

foreach (VXmlNode.VObject Objectparameter in parameters.Concat(results)) 
{ 
    BooleanExpression parapresenceCondition = Objectparameter.GetPresenceCondition(); 
} 
Verwandte Themen