Правильно ли используется этот оператор LINQ? - PullRequest
0 голосов
/ 01 апреля 2012

Я пытаюсь найти и собрать все элементы, которые отвечают этим требованиям:

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

с помощью цикла foreach:

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>

Связано ли это с тем, что я выбрал старшего брата, когда искал младшего брата?то есть я сначала искал Prerequisite, а затем сказал выбрать его Name.Value (в checkTest)

Даже когда я пытаюсь сделать оператор if как! =, он напечатает каждое предварительное условие, даже если его нет!

1 Ответ

2 голосов
/ 01 апреля 2012

Проблема в том, что checkTest это IEnumerable<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

С ответ Я дал вам вчера утром похожую тему, вы используете класс Module и Dictionary<String,Module>?Если так, почему вы делаете этот запрос?У вас уже есть все, что нужно для выполнения этого без запроса:

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

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

2nd Edit, чтобы ответить на актуальный вопрос запроса LINQ

В моем предыдущем редактировании предлагалось вернуться кПредыдущие вопросы и предъявление исков к предварительно загруженному XML и коллекции все еще являются лучшим решением, но поскольку ваши вопросы, похоже, возвращаются к использованию LINQ-to-XML, у вас, очевидно, есть причина предпочесть его.

Я выбрал болееподробный взгляд на ваш вопрос, и я думаю, у меня есть проблема.Вы сравниваете 2 элемента, которые никогда не будут совпадать.В своем запросе checkTest вы выбираете список Names, у которого есть предварительное требование, но вы пытаетесь сравнить со списком предварительных требований, которые содержат только код.

Вы должны использовать мой запрос, который япредоставляется для проверки совпадений, но вы должны получить checkTest со следующим:Ваш последний комментарий, запрос, который я вам предоставил, является альтернативной формой запроса LINQ, который я предпочитаю делать меньшим / более коротким запросом.

Вы можете переписать этот запрос, используя синтаксис запроса, который вы использовали как:

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

оператор => называется лямда-выражением.Попробуйте найти синтаксис запроса LINQ и / или лямбда-выражения, чтобы понять разницу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...