網(wǎng)站首頁 編程語言 正文
在 C# 9 中,foreach 循環(huán)可以使用擴(kuò)展方法。在本文中,我們將通過例子回顧 C# 9 中如何擴(kuò)展 foreach 循環(huán)。
代碼演示
下面是一個(gè)對樹形結(jié)構(gòu)進(jìn)行深度優(yōu)先遍歷的示例代碼:
using System;
using System.Collections.Generic;
namespace Example
{
class TreeNode
{
public int Value { get; set; }
public List<TreeNode> Children { get; set; }
public TreeNode(int value)
{
Value = value;
Children = new List<TreeNode>();
}
}
static class TreeExtensions
{
public static IEnumerable<TreeNode> DepthFirst(this TreeNode root)
{
yield return root;
foreach (var child in root.Children.SelectMany(DepthFirst))
{
yield return child;
}
}
}
class Program
{
static void Main(string[] args)
{
var root = new TreeNode(1);
root.Children.Add(new TreeNode(2));
root.Children.Add(new TreeNode(3));
root.Children[0].Children.Add(new TreeNode(4));
root.Children[0].Children.Add(new TreeNode(5));
foreach (var node in root.DepthFirst())
{
Console.WriteLine(node.Value);
}
// Outputs: 1 2 4 5 3
}
}
}
在這個(gè)示例代碼中,我們在 TreeNode 類中定義了一個(gè)值屬性和一個(gè)存儲(chǔ)子節(jié)點(diǎn)的列表屬性。我們還在 TreeExtensions 類中定義了一個(gè) DepthFirst 擴(kuò)展方法,該方法使用 yield return 語句來返回樹形結(jié)構(gòu)的深度優(yōu)先遍歷結(jié)果。
在 Main 方法中,我們創(chuàng)建了一個(gè)樹形結(jié)構(gòu),然后使用 foreach 循環(huán)來遍歷樹形結(jié)構(gòu)的深度優(yōu)先遍歷結(jié)果。
之所以使用擴(kuò)展方法往往是因?yàn)椋覀兛梢栽诓恍薷?TreeNode 類的情況下,為 TreeNode 類添加新的功能。
那么接下來我們希望在 C# 9 中默認(rèn)為 TreeNode 類添加 DepthFirst 行為,這樣我們就可以直接使用 foreach 循環(huán)來遍歷樹形結(jié)構(gòu)的深度優(yōu)先遍歷結(jié)果了。
C# 9 中的 foreach 擴(kuò)展
在 C# 9 中,我們可以使用 foreach 擴(kuò)展來實(shí)現(xiàn)上面的需求。我們只需要在 TreeNode 類中添加一個(gè) GetEnumerator 方法,該方法返回一個(gè)實(shí)現(xiàn)了 IEnumerable 接口的對象即可。
static class TreeExtensions
{
public static IEnumerable<TreeNode> DepthFirst(this TreeNode root)
{
yield return root;
foreach (var child in root.Children.SelectMany(DepthFirst))
{
yield return child;
}
}
public static IEnumerator<TreeNode> GetEnumerator(this TreeNode root)
{
return root.DepthFirst().GetEnumerator();
}
}
在上面的代碼中,我們在 TreeNode 類中添加了一個(gè) GetEnumerator 方法,該方法返回一個(gè)實(shí)現(xiàn)了 IEnumerable 接口的對象。這個(gè)對象就是我們在 DepthFirst 方法中使用 yield return 語句返回的結(jié)果。
現(xiàn)在我們可以直接使用 foreach 循環(huán)來遍歷樹形結(jié)構(gòu)的深度優(yōu)先遍歷結(jié)果了。
foreach (var node in root)
{
Console.WriteLine(node.Value);
}
總結(jié)
在 C# 9 中,我們可以使用 foreach 擴(kuò)展來為類添加新的行為。在上面的示例代碼中,我們?yōu)?TreeNode 類添加了 DepthFirst 行為,這樣我們就可以直接使用 foreach 循環(huán)來遍歷樹形結(jié)構(gòu)的深度優(yōu)先遍歷結(jié)果了。
原文鏈接:https://www.cnblogs.com/newbe36524/p/17018770.html
相關(guān)推薦
- 2022-07-26 proteus仿真arduino中調(diào)用DHT11/22溫濕度傳感器
- 2022-11-07 .NET?實(shí)現(xiàn)啟動(dòng)時(shí)重定向程序運(yùn)行路徑及?Windows?服務(wù)運(yùn)行模式部署的方法_實(shí)用技巧
- 2022-07-12 CSS樣式:樣式的沖突 樣式的繼承 偽元素 偽類
- 2022-08-18 Git多人協(xié)同開發(fā)緊急修復(fù)線上bug操作指南_相關(guān)技巧
- 2022-07-23 springboot-數(shù)據(jù)驗(yàn)證及全局異常處理
- 2022-04-08 python如何去除異常值和缺失值的插值_python
- 2023-12-06 Warn: Could not find @TableId
- 2022-03-31 python常用內(nèi)置模塊你了解嗎_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支