簡體   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