如何在C#中实现支持多准则多决策的决策矩阵?
实现支持任意准则与决策的决策矩阵的可行思路
先说说你那两个初始方案的问题:
- 第一个用
Dictionary<DecisionCriteria, int>的思路,核心问题是DecisionCriteria作为字典键必须正确重写Equals()和GetHashCode()方法,否则字典会把内容相同的实例当成不同键。而且这种结构只存了评分映射,没法直接获取所有准则或决策的列表,后续展示矩阵时会很麻烦,扩展性不足。 - 第二个字符串数组方案确实不推荐,完全没有类型安全,每次读取评分都要手动转int,还容易因为数组索引对应错误出bug,维护成本极高。
下面给几个实用的实现思路,按需选择:
方案一:面向对象分层结构(推荐,扩展性强)
通过几个核心类封装数据,结构清晰,方便后续扩展功能(比如给准则加权重、给决策加描述):
// 准则类,可扩展权重、描述等属性 public class Criterion { public string Name { get; set; } public int Weight { get; set; } = 1; // 默认权重1 } // 决策选项类,可扩展描述、链接等属性 public class DecisionOption { public string Name { get; set; } public string Description { get; set; } } // 评分条目类,关联决策、准则和评分 public class ScoreEntry { public DecisionOption Decision { get; set; } public Criterion Criterion { get; set; } public int Score { get; set; } } // 决策矩阵主类,整合所有数据 public class DecisionMatrix { public List<Criterion> Criteria { get; set; } = new List<Criterion>(); public List<DecisionOption> Decisions { get; set; } = new List<DecisionOption>(); public List<ScoreEntry> Scores { get; set; } = new List<ScoreEntry>(); // 快速获取某决策某准则的评分 public int GetScore(DecisionOption decision, Criterion criterion) { var entry = Scores.FirstOrDefault(s => s.Decision == decision && s.Criterion == criterion); return entry?.Score ?? 0; // 无评分返回0或按需处理 } }
优点:完全面向对象,属性可灵活扩展,数据关联性强;缺点:需要写更多类,初期代码量稍大。
方案二:嵌套字典结构(轻量快速实现)
如果不需要复杂扩展,用嵌套字典可以快速搭建核心结构:
// 外层键:决策名称,内层键:准则名称,值:评分 var decisionMatrix = new Dictionary<string, Dictionary<string, int>>(); // 添加示例数据 decisionMatrix.Add("U Delaware", new Dictionary<string, int> { { "学费", 12 }, { "就业率", 57 }, { "排名", 16 } });
优点:零额外类,代码简洁;缺点:类型安全稍弱,需要手动处理键不存在的情况(比如用TryGetValue),无法直接扩展准则/决策的额外属性。
方案三:DataTable(适合UI绑定场景)
如果需要快速和UI控件(比如WinForms的DataGridView、WPF的DataGrid)绑定,用DataTable会非常方便:
var matrixTable = new DataTable(); // 添加第一列(决策名称列) matrixTable.Columns.Add("决策选项", typeof(string)); // 动态添加准则列 var criteria = new List<string> { "学费", "就业率", "排名" }; foreach (var crit in criteria) { matrixTable.Columns.Add(crit, typeof(int)); } // 添加决策行 matrixTable.Rows.Add("U Delaware", 12, 57, 16); matrixTable.Rows.Add("U Penn", 25, 89, 7);
优点:自带数据绑定能力,支持排序、筛选,适合快速做界面;缺点:类型安全不足,数据关联性弱,不适合复杂业务逻辑扩展。
实现要点提示
- 无论用哪种方案,都要加验证逻辑:确保每个决策对每个准则都有对应的评分,避免空值或遗漏。
- 如果需要计算决策总分,可以遍历准则的权重和对应评分相乘后累加。
- 展示矩阵时,先遍历所有准则作为表头,再遍历每个决策行,对应填充评分即可。
内容的提问来源于stack exchange,提问作者Alejandro Rodriguez
相关产品推荐
相关产品推荐

