2012-04-01 5 views
0

Ich versuche, alle Elemente zu finden und zu sammeln, die diese Anforderungen erfüllen:Wird diese LINQ-Anweisung korrekt verwendet?

var checkTest = from d in document.Descendants("Prerequisite") 
       where d.Value != "none" 
       select d.Parent.Element("Name").Value; 

durch diese foreach-Schleife:

foreach (var item in prerequisite) 
{ 
    if (item == checkTest.ToString()) 
    { 
     MessageBox.Show("this module has a prereq" + item); 
    } 
} 

aber es wird nicht aus irgendeinem Grund, etwas zu tun, jemand Warum? Ich denke, das Problem ist in der var checkTest

(das ist, was in der foreach Voraussetzung bedeutet :)

var prerequisite = from d in document.Descendants("Name") 
        where d.Value == (String)listBox2.SelectedItem 
        select d.Parent.Element("Prerequisite").Value; 

Hier ist der XML ist:

<?xml version="1.0" encoding="utf-8" ?> 
<SoftwareEngineering> 
    <Module> 
    <Name>Algorithms and Data Structures</Name> 
    <Code>3SFE504</Code> 
    <Capacity>5</Capacity> 
    <Semester>1</Semester> 
    <Prerequisite>none</Prerequisite> 
    </Module> 
    <Module> 
    <Name>3D Graphics I</Name> 
    <Code>3SFE508</Code> 
    <Capacity>5</Capacity> 
    <Semester>1</Semester> 
    <Prerequisite>none</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Event-Driven Programming</Name> 
    <Code>3SFE513</Code> 
    <Capacity>10</Capacity> 
    <Semester>1</Semester> 
    <Prerequisite>none</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Object Oriented Design</Name> 
    <Code>3SFE514</Code> 
    <Capacity>10</Capacity> 
    <Semester>1</Semester> 
    <Prerequisite>none</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Requirements Engineering</Name> 
    <Code>3SFE516</Code> 
    <Capacity>10</Capacity> 
    <Semester>1</Semester> 
    <Prerequisite>none</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Introduction to AI</Name> 
    <Code>3SFE599</Code> 
    <Capacity>5</Capacity> 
    <Semester>1</Semester> 
    <Prerequisite>none</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Java Mobile Application Development</Name> 
    <Code>3SFE540</Code> 
    <Capacity>5</Capacity> 
    <Semester>1</Semester> 
    <Prerequisite>3SFE514(corequisite)</Prerequisite> 
    </Module> 
    <Module> 
    <Name>C# .NET Programming</Name> 
    <Code>3SFE541</Code> 
    <Capacity>5</Capacity> 
    <Semester>1</Semester> 
    <Prerequisite>3SFE514(corequisite)</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Software Engineering Group Project</Name> 
    <Code>3SFE515</Code> 
    <Capacity>5</Capacity> 
    <Semester>2</Semester> 
    <Prerequisite>3SFE514(corequisite)</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Software Engineering</Name> 
    <Code>3SFE519</Code> 
    <Capacity>10</Capacity> 
    <Semester>2</Semester> 
    <Prerequisite>none</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Mobile User Interface Development</Name> 
    <Code>3SFE542</Code> 
    <Capacity>5</Capacity> 
    <Semester>2</Semester> 
    <Prerequisite>3SFE540</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Interactive Multimedia</Name> 
    <Code>3MTS954</Code> 
    <Capacity>5</Capacity> 
    <Semester>2</Semester> 
    <Prerequisite>none</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Concurrent Programming</Name> 
    <Code>3SFE555</Code> 
    <Capacity>5</Capacity> 
    <Semester>2</Semester> 
    <Prerequisite>none</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Mobile Gaming</Name> 
    <Code>3SFE557</Code> 
    <Capacity>10</Capacity> 
    <Semester>2</Semester> 
    <Prerequisite>none</Prerequisite> 
    </Module> 
    <Module> 
    <Name>Intelligent Systems</Name> 
    <Code>3SFE500</Code> 
    <Capacity>10</Capacity> 
    <Semester>2</Semester> 
    <Prerequisite>3SFE599</Prerequisite> 
    </Module> 
    <Module> 
    <Name>3D Graphics II</Name> 
    <Code>3SFE501</Code> 
    <Capacity>10</Capacity> 
    <Semester>2</Semester> 
    <Prerequisite>3SFE508</Prerequisite> 
    </Module> 
</SoftwareEngineering> 

Hat es mit meiner Auswahl zu tun ein Obergeschwister, wenn er nach seinem niedrigsten Geschwister gesucht hat? d. h., ich suchte zuerst nach Prerequisite und dann nach Name. Wert (in checkTest)

Selbst wenn ich versuche, die if-Anweisung als! = zu setzen, wird jede Voraussetzung gedruckt, auch wenn sie keine ist!

Antwort

2

Das Problem ist checkTest ist IEnumerable<String>, keine Zeichenfolge, so ToString() Aufruf bietet nicht einen guten Wert zu vergleichen. FYI - IEnumerable<T> ist der Rückgabewert aller grundlegenden LINQ-Abfragen, obwohl es Möglichkeiten gibt, das erste oder letzte Element zu extrahieren.

Es sieht aus wie Sie eine Liste von Voraussetzungen zu bekommen versuchen, die also in checkTest

eines der Elemente entsprechen sollten Sie etwas wie versuchen:

var match = prerequisite.Where(x => checkTest.Contains(x)).Select(item => item); 

foreach (var pr in match) 
{ 
    MessageBox.Show("this module has a prereq" + pr); 
} 

EDIT: Antwort aktualisiert basierend auf früheren Frage von OP

Von der answer gab ich Ihnen gestern Morgen zu einem ähnlichen Thema, verwenden Sie die Module Klasse und ? Wenn ja, warum machst du diese Abfrage? Sie haben bereits alles, was Sie dies ohne eine Abfrage erreichen müssen:

var pr = modules[(String)listBox1.SelectedValue].Prerequisite; 

if (pr != "none") 
    MessageBox.Show("this module has a prereq" + pr); 

2. Bearbeiten tatsächlichen LINQ-Abfrage Frage

Meine bisherigen bearbeiten was darauf hindeutet, geht zurück auf die vorangegangenen Fragen und verklagt die vorinstallierten XML zu beantworten und die Sammlung ist immer noch eine bessere Lösung, aber da Ihre Fragen anscheinend auf LINQ-to-XML zurückgehen, haben Sie offensichtlich einen Grund, es zu bevorzugen.

Ich nahm einen detaillierteren Blick auf Ihre Frage, und ich denke, ich habe das Problem. Sie vergleichen 2 Elemente, die niemals übereinstimmen. In Ihrer checkTest Abfrage wählen Sie eine Liste von Names, die eine Voraussetzung haben, aber Sie versuchen, mit einer Liste von Voraussetzungen zu vergleichen, die nur einen Code enthalten.

Sie sollen meine Abfrage, die ich für die Spiele zu überprüfen, zur Verfügung gestellt, aber Sie sollten checkTest mit dem follopwing erhalten:

var checkTest = from d in xdoc.Descendants("Prerequisite") 
       where d.Value != "none" 
       select d.Parent.Element("Prerequisite").Value; 

EDIT # 3 - Umschreiben mit LINQ-Abfragesyntax

zu reagieren Zu Ihrem letzten Kommentar ist die Abfrage, die ich Ihnen zur Verfügung gestellt habe, eine alternative Form der LINQ-Abfrage, die ich eher zu kleineren/kürzeren Abfragen bevorzuge.

Sie könnten diese Abfrage schreiben die Abfragesyntax verwenden Sie verwendet haben:

var match = from x in prerequisite 
      where checkTest.Contains(x) 
      select x; 

der Operator => ein lamda Ausdruck bezeichnet wird. Versuchen Sie nach LINQ Abfrage Syntax und/oder Lambda-Ausdrücke zu suchen, um den Unterschied zu verstehen

+0

Hi wieder psubsee, habe ich versucht, aber immer noch nichts, lustige Sache ist, dass nichts auftaucht:/ – a7omiton

+0

@ AZ1 haben Sie angeschaut die Inhalte von 'Voraussetzung' und' CheckTest' ohne die Abfrage zu sehen, was in jedem ist? Sind Sie sicher, dass Sie eine Übereinstimmung haben? – psubsee2003

+0

@ AZ1 was versuchst du zu erreichen? Es sieht so aus, als ob Sie versuchen, eine bestimmte Voraussetzung aus Ihrem XML für einen Kurs zu erhalten, der mit dem Namen übereinstimmt, den der Benutzer in der Liste ausgewählt hat? Wenn Sie auf einige Ihrer Fragen von gestern zurückblicken, sieht es so aus, als wäre dies eine Folge Ihrer vorherigen Fragen - haben Sie noch eine Modul- und eine Modul-Sammlung? Wenn ja, warum benutzt du es nicht? – psubsee2003