2012-04-01 70 views
0

我試圖尋找和收集所有滿足這些要求的元素:使用此foreach循環這個LINQ語句是否正確使用?

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

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

,但它不會因某種原因做任何事,任何人知道爲什麼?我認爲這個問題是在var checkTest

(這是前提條件在foreach :)

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

這裏指的是XML:

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

是否與我的選擇做一個兄弟姐妹在尋找最低的兄弟姐妹時?即我先搜索先決條件,然後說要選擇其Name.Value(在checkTest

即使我嘗試使if語句爲!=,它將打印每個前提條件,即使它沒有!

回答

2

問題是checkTestIEnumerable<String>,不是字符串,所以調用ToString()也沒有提供比較好的價值。 FYI - IEnumerable<T>是所有基本LINQ查詢的返回值,雖然有方法可以提取第一個或最後一個元素。

它看起來像你正試圖獲得匹配的元素之一,在checkTest

所以,你應該嘗試像前提條件的列表:根據以往的更新答案:

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

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

編輯通過OP

answer我昨天早上給你類似的話題,你使用Module類和Dictionary<String,Module>?如果是這樣,你爲什麼要做這個查詢? 你已經擁有你需要的一切無需查詢做到這一點:

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

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

第二編輯回答實際LINQ查詢問題

我以前的編輯提示回到以前的問題和起訴所預加載XML收集仍然是一個更好的解決方案,但由於您的問題似乎回到了使用LINQ-to-XML,您顯然有理由更喜歡它。

我仔細看了一下你的問題,我想我有這個問題。你正在比較兩個永遠不會匹配的元素。在您的checkTest查詢中,您正在選擇一個包含prereq的Names的列表,但您試圖與僅包含代碼的prereq列表進行比較。

你應該用我的查詢,我提供給檢查的比賽,但你應該得到checkTest與follopwing:

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

編輯#3 - 使用LINQ查詢語法,改寫

爲響應到您最後的評論,我提供給您的查詢是LINQ查詢的替代形式,我傾向於更小/更短的查詢。

您可以使用您一直在使用的查詢語法重寫查詢:

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

=>操作符被稱爲LAMDA表達。嘗試搜索LINQ查詢語法和/或Lambda表達式來幫助理解差異

+0

嗨,再次psubsee,我試過但仍然沒有得到任何東西,有趣的是,沒有東西彈出:@ – a7omiton 2012-04-01 10:34:47

+0

@ AZ1你看了'prerequisite'和'checkTest'的內容沒有查詢,看看每個內容是什麼?你確定你有一場比賽嗎? – psubsee2003 2012-04-01 10:36:52

+0

@ AZ1你想完成什麼?它看起來像你試圖從你的XML獲得一個特定的先決條件,用於匹配用戶在列表框中選擇的名稱的課程?回顧你昨天的一些問題,看起來這可能是你以前的一些問題的後續 - 你是否仍然有一個'Module'類和一個'modules'集合?如果是這樣,你爲什麼不使用它? – psubsee2003 2012-04-01 10:42:49