2012-03-14 2 views
1

Я пытаюсь напечатать «Название книги, имена авторов» (некоторые книги имеют более одного автора) Ниже Linq код печатает только первого автора. Как распечатать всех авторов, связанных с книгой?Как я могу выполнить цикл Через все элементы в .select statement в Linq

List<string> books = docs.Descendants(name) 

    .Select(x => new { 
     Title = (string)x.Element(ns+"TITLE"), 
      Author = x.Element(ns+"INTEL_AUTH") 
     }) 
.Select(x => new { 
      Title = x.Title, 
      FirstName = (string) x.Author.Element(ns+"FNAME"), 
      MiddleInitial = (string) x.Author.Element(ns+"MNAME"), 
      LastName = (string) x.Author.Element(ns+"LNAME"), 
     }) 
.Select(x => string.Format("{0}: {1} {2} {3}", 
          x.Title, 
          x.FirstName, x.MiddleInitial, x.LastName)) 
.ToList(); 

for (int i = 0; i < books.Count; i++) 
{  
    Response.Write("--" + books[i] + "<BR />");  
} 

XML Вот код XML. ТЕСТ 1 Джон МЭ Джон SKEET

<INTEL_AUTH ID="10"> 
<FNAME>JO</FNAME> 
<MNAME></MNAME> 
<LNAME>JO</LNAME> 
<INTEL_AUTH> 
</INTEL> 

    <INTEL> 
    <TILE> LEARNING LINQ</TITLE> 
    <INTEL_AUTH ID="2"> 
    <FNAME> SHELLY</FNAME> 
    <MNAME></MNAME> 
    <LNAME>SHELLY</LNAME> 
    <INTEL_AUTH iD="3"> 
    <FNAME>CHRIS</FNAME> 
    <MNAME></MNAME> 
    <LNAME>MADISON</LNAME> 
    </INTEL_AUTH> 


    </INTEL> 
    </RECORD> 
    </XML> 

Я хочу выдачу результатов КАК: (НАЗВАНИЕ): Все авторы писавшего, что BOOK

ИСПЫТАНИЕ 1: ДЖОН ДУ, ДЖОН СЕТЬ, JO JO LEARNING LINQ: S HELLY SHELLY, CHRIS MADISON

+1

сообщение часть XML, это будет легче помочь вам –

+1

«Как могу ли я напечатать всех авторов, связанных с книгой? " - by _not_ уничтожить всю структуру с помощью string.Format(). –

+0

Отметьте SelectMany: http://jesseliberty.com/2011/03/22/linq-selectmany/ –

ответ

4

Неясно, хотите ли вы получить один результат с несколькими авторами или один результат на автора, или как вы ожидаете, что это будет представлено в List<string>. Я подозреваю, что это будет делать то, что вам нужно, хотя:

var query = docs.Descendants(name) 
    // First get the relevant elements out of the main book element 
    .Select(x => new { 
     Title = (string) x.Element(ns + "TITLE"), 
     Authors = x.Elements(ns + "INTEL_AUTH") 
    }) 
    // Now transform them from LINQ to XML into plain objects 
    .Select(x => new { 
     Title = x.Title, 
     Authors = x.Authors.Select(a => new { 
      FirstName = (string) a.Element(ns + "FNAME"), 
      MiddleInitial = (string) a.Element(ns + "MNAME"), 
      LastName = (string) a.Element(ns + "LNAME") 
     }) 
    }); 

foreach (var book in query) 
{ 
    Console.WriteLine("{0}:", book.Title); 
    foreach (var author in book.Authors) 
    { 
     Console.WriteLine(" {0} {1} {2}", 
          author.FirstName, author.MiddleInitial, 
          author.LastName); 
    } 
} 
+0

Вы заменили книги Query, чтобы книги не существовали в текущем контексте (получение ошибки в каждом цикле) Все приведенные ниже 3 строки кода дают ошибки FirstName = (string) a.Author.Element (ns + "FNAME"), MiddleInitial = (строка) a.Author.Element (ns + "MNAME"), LastName = (string) a.Author.Element (ns + "LNAME") – SmilingLily

+0

Ошибка «System.Xml.Linq.XElement» не содержит определения для «Author» и не используется метод расширения «Автор», принимающий первый аргумент типа «System.Xml.Linq.XElement» можно найти (вы не указали директиву использования или ссылку на сборку?) – SmilingLily

+1

@SmilingLily: Исправлено оба, но, честно говоря, вы должны быть в состоянии * понять * код достаточно хорошо, чтобы исправить t ypos для себя. Если вы не можете понять, что делает код, вы никогда не сможете поддерживать его без постоянного потока вопросов в SO. –

1

Я выбираю всех авторов в IEnumerable затем агрегировать их:

var books = docs.Descendants(name)  
       .Select(x => new 
       { 
        Title = (string)x.Element(ns + "TITLE"), 
        Author = x.Elements(ns + "INTEL_AUTH") // Elements not Element here 
       }) 
       .Select(x => new 
       { 
        Title = x.Title, 
        Names = x.Author.Select(i => new 
        { 
         FirstName = (string)i.Element(ns + "FNAME"), 
         MiddleInitial = (string)i.Element(ns + "MNAME"), 
         LastName = (string)i.Element(ns + "LNAME") 
        }) 
       }) 
       .Select(x => string.Format("{0}: {1}", 
            x.Title, 
            x.Names 
             .Select(i => 
              string.Format("{0} {1} {2}", 
               i.FirstName, 
               i.MiddleInitial, 
               i.LastName)) 
             .Aggregate((working, next) => 
              working + " | " + next))) 
       .ToList(); 
+0

Выше код не возвращает никаких элементов. Книги.Count is null – SmilingLily

+1

Что-то должно измениться – Joe

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