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