C# 泛型约束为枚举

示例:根据权重对象列表随机返回一个枚举类型

using System.Collections;
using UnityEngine;

public static class WeightObjectsUtil {

    /// <summary>
    /// 随机在权重列表返回一个枚举类型
    /// </summary>
    /// <typeparam name="T"> 枚举类型 </typeparam>
    /// <param name="weightObjects"> 权重对象列表 </param>
    /// <param name="defaultType"> 默认返回的枚举类型 </param>
    /// <returns></returns>
    public static T GetLandTypeWithWeightList<T> ((T type, int weight)[] weightObjects, T defaultType) where T : System.Enum {
        // 总权重
        int sumWeight = 0;
        for (int i = 0, len = weightObjects.Length; i < len; i++) {
            sumWeight += weightObjects[i].weight;
        }

        // 随机数 [0, sumWeight)
        int n = Random.Range(0, sumWeight);
        // 根据随机数所在总权重线段上的落点计算出结果
        int m = 0;
        for (int i = 0, len = weightObjects.Length; i < len; i++) {
            (T landType, int weight) weightObj = weightObjects[i];
            if (n >= m && n < m + weightObj.weight) {
                return weightObj.landType;
            }

            m += weightObj.weight;
        }
        return defaultType;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值