2013-05-29 7 views
2

После прочтения около 40-50 вопросов и ответов (я пробовал много вещей), что, когда все немного от ответа, я все еще не могу понять, как это не работает:Почему Equals не работает должным образом

IEnumerable<string> textSegs = from cd in cds 
     where cd.Artist.Equals("Dream Theater") 
     select cd.Artist; 

foreach(string s in textSegs) 
    Console.Write("\nTrack: " + s); 

//This outputs: 'Track: Dream Theater' 

Теперь, как и для другой части:

IEnumerable<string> textSegs = from seg in myXMLDoc.Descendants("name") 
    where ((string)seg).Equals("Dream Theater") 
    select (string)seg; 
//This puts: exactly what I need 

Тогда я полагал, что это будет сделать магический трюк:

IEnumerable<string> textSegs = from seg in myXMLDoc.Descendants("name") 
    where ((string)seg).Equals(from cd in cds 
           where cd.Artist.Equals("Dream Theater") 
           select cd.Artist) 
    select (string)seg; 

//This outputs: Everything that is inside the XMLDoc (no filter applied) 

Что касается формата, в котором находится этот код. Я боюсь, что он должен быть таким (присвоением). Я попробовал направить запрос на строку, но он говорит мне:

Cannot convert type 'IEnumerable<string>' to 'string' 

Любая помощь приветствуется!

+2

'from ... select' - это _set_ строк. Вы не можете проверить, равна ли это одной строке. – SLaks

ответ

2

Вы по существу должны спросить, если один набор данных содержит другое подмножество данных:

var artistQuery = from cd in cds 
        where cd.Artist.Equals("Dream Theater") 
        select cd.Artist; 

IEnumerable<string> textSegs = from seg in myXMLDoc.Descendants("name") 
           where artistQuery.Contains((string) seg) 
           select (string)seg; 

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

IEnumerable<string> textSegs = from seg in myXMLDoc.Descendants("name") 
           where (from cd in cds 
             where cd.Artist.Equals("Dream Theater") 
             select cd.Artist).Contains((string) seg) 
           select (string)seg; 
+0

Это очень понравилось! –

3

Это звучит для меня, как вы пытаетесь сделать это:

IEnumerable<string> textSegs = 
    from seg in myXMLDoc.Descendants("name") 
    where ((string)seg).Equals(
     (from cd in cds 
      where cd.Artist.Equals("Dream Theater") 
      select cd.Artist).First()) 
    select (string)seg; 

Или это, что немного легче читать:

IEnumerable<string> textSegs = 
    from seg in myXMLDoc.Descendants("name") 
    let artist = 
     (from cd in cds 
      where cd.Artist.Equals("Dream Theater") 
      select cd.Artist).First() 
    where ((string)seg).Equals(artist) 
    select (string)seg; 
1

Попробуйте присоединиться, я не могу думать о более чистого способа сделать это:

from seg in myXMLDoc.Descendants("name") 
join cd in cds 
    on (string)seg equals cd.Artist 
where cd.Artist.Equals("Dream Theater") 
select (string)seg; 

Не скомпилированы, так что у него может быть ошибка или две, но это точно по этим строкам точно :)

1

Ваш «из cd» в правой руке Equals возвращает все результаты, соответствующие вашим критериям , а не только один.

Смежные вопросы