2012-04-01 152 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