You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:05:23