繁体   English   中英

在C#中将嵌套的for循环转换为声明式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM