[英]Converting a nested for loop to declarative in c#
如何将嵌套的for循环转换为声明式样式?
样例代码:
List<String> words = new List<String>();
Books.ForEach(book => book.ForEach(page =>
page.ForEach(line =>words.Add(CreateWord(book, page, line)))));
如果您希望提高可读性,则可以逐步进行。 首先将每个book
条目扩展为一系列(书籍,页面)对。 然后,每对转换为三元组(书籍,页面,行),并使用CreateWords
方法将其转换为字符串。
代码所讲的不只是文字,这是它的外观:
List<string> words = Books
.SelectMany(book => book.Pages.Select(page => new
{
Book = book,
Page = page
}))
.SelectMany(pair => pair.Page.Lines.SelectMany(line =>
new CreateWords(book, page, line));
这可能不是最易读的LINQ代码。 但是它经常会这样。 LINQ倾向于生成紧凑但难看的映射代码。
在相关说明中,我想知道CreateWords
方法的目的是什么? 如果只返回一个字符串序列,则不需要整个学习过程,包括书本,页面和行。 如果我是对的,则可以将CreateWords
更改为仅接收代表该行的单个字符串-根本不需要书或页面对象。 在这种情况下,查询将被简化:
List<string> words = Books
.SelectMany(book => book.Pages)
.SelectMany(page => page.Lines)
.SelectMany(line => CreateWords(line));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.