拓扑排序

本文介绍了一种使用 C# 实现的拓扑排序算法,并通过具体示例展示了如何构建拓扑图并进行排序的过程。该算法适用于检测有向无环图中的依赖关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<pre name="code" class="csharp">using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1 {
<pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; line-height: 21px; font-family: 'Courier New' !important;"><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;"></span><pre name="code" class="csharp">        class Program {
            static void Main(string[] args)
            {
              List<TopologicNode> nodes = new List<TopologicNode>()
              {
                new TopologicNode(){ Key = "XMedia", 
                    Dependences = new List<string>(){ "XMedia.Controllers", "XMedia.Models", "XMedia.Logics", "XMedia.Commons" } },
                new TopologicNode(){ Key = "XMedia.Controllers",
                    Dependences = new List<string>(){"XMedia.Models","XMedia.Logics","XMedia.Commons"}},
                new TopologicNode(){ Key = "XMedia.Logics", 
                    Dependences = new List<string>(){ "XMedia.Models","XMedia.Commons"}},
                new TopologicNode(){ Key = "XMedia.Models" },
                new TopologicNode(){ Key = "XMedia.Commons" }
             };
 
            //输出拓扑排序的结果
            TopologicSort sort = new TopologicSort();
            foreach (var key in sort.OrderBy(nodes)) {
                Console.WriteLine(key);
            }
            Console.ReadLine();
         }
    }

/// <summary> /// 拓扑排序类。 /// </summary> public class TopologicSort { /// <summary> /// 拓扑顺序。 /// </summary> /// <typeparam name="TKey">节点的键值类型。</typeparam> /// <param name="nodes">一组节点。</param> /// <returns>拓扑序列。</returns> /// <exception cref="InvalidOperationException">如果存在双向引用或循环引用,则抛出该异常。</exception>
 public IEnumerable<string> OrderBy(IEnumerable<TopologicNode> nodes) { if (nodes == null) yield break; //复制一份,便于操作 List<TopologicNode> list = new List<TopologicNode>(); foreach (var item in nodes) { TopologicNode node = new TopologicNode() { Key = item.Key
 }; if (item.Dependences != null) node.Dependences = new List<string>(item.Dependences); list.Add(node); } while (list.Count > 0) { //查找依赖项为空的节点 var item = list.FirstOrDefault(c => c.Dependences == null || c.Dependences.Count == 0); if (item != null) { yield
 return item.Key; //移除用过的节点,以及与其相关的依赖关系 list.Remove(item); foreach (var otherNode in list) { if (otherNode.Dependences != null) otherNode.Dependences.Remove(item.Key); } } else if (list.Count > 0) { //如果发现有向环,则抛出异常 throw new InvalidOperationException("存在双向引用或循环引用。");
 } } } } /// <summary> /// 拓扑节点类。 /// </summary> public class TopologicNode { /// <summary> /// 获取或设置节点的键值。 /// </summary> public string Key { get; set; } /// <summary> /// 获取或设置依赖节点的键值列表。 /// </summary> public List<string> Dependences { get; set; } }}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值