如何循环遍历Linq中.select语句中的所有元素
本文关键字:语句 select 元素 Linq 何循环 循环 遍历 | 更新日期: 2023-09-27 18:27:51
我正在尝试打印"书名,作者姓名"(有些书有多个作者)下面的林克代码只打印第一作者。如何打印与一本书相关的所有作者?
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约翰DOE约翰双向飞碟
<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>
我希望输出显示为:(标题):所有作者世界卫生组织写那本书
测试一:杜、斯凯、乔学习林克:雪莉雪莉,克里斯·麦迪逊
目前尚不清楚您是想要多个作者的单个结果,还是每个作者的单个成果,或者您希望如何在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);
}
}
我将所有作者选择到一个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();