c# - C# 中 java.lang.Number 的等价物
问题描述
我想在以数字为值的字典之间进行算术运算。这是我的代码:
public class DictionaryOperation {
public static Dictionary<TKey, double> Add<TKey>(Dictionary<TKey, double> d1, Dictionary<TKey, double> d2) {
Dictionary<TKey, double> result = new Dictionary<TKey, double>();
foreach (TKey key in d1.Keys) {
if (d2.ContainsKey(key))
result[key] = d1[key] + d2[key];
else
result[key] = d1[key];
}
foreach (TKey key in d2.Keys) {
if (!result.ContainsKey(key))
result[key] = d2[key];
}
return result;
}
}
我想知道我是否只能为任何数字类型(int float、decimal ...)创建一种方法,还是必须为每种数字类型创建一种方法,这意味着每种方法中都有相同的代码。
我希望能够做到这一点:
Dictionary<string, int> ints = DictionaryOperation.Add(new Dictionary<string, int>(), new Dictionary<string, int>());
Dictionary<string, float> floats = DictionaryOperation.Add(new Dictionary<string, float>(), new Dictionary<string, float>());
解决方案
您可以避免使用泛型为每种数字类型编写相同的方法。您的字典中已经有一个通用键。唯一缺少的是通用值。更改您的方法以使用通用字典值:
public static Dictionary<TKey, TValue> Add<TKey, TValue>(Dictionary<TKey, TValue> d1, Dictionary<TKey, TValue> d2)
where TValue : IComparable
问题是,没有类型约束只允许数字(或可以使用 + 运算符添加的对象)。我IComparable
在上面的行中使用了,因为所有数字类型都是可比较的。
下一个问题是,IComparable
在尝试使用运算符时没有帮助+
。为此,您可以使用如下动态:
dynamic a = d1[key];
dynamic b = d2[key];
result[key] = a + b;
现在您可以将该方法用于实现 IComparable 的所有类型。但是您没有编译时安全性。这意味着您将获得所有未实现该+
运算符的类型的运行时错误。
此问题已在此处描述: C# 添加两个通用值
这里是完整的方法:
public static Dictionary<TKey, TValue> Add<TKey, TValue>(Dictionary<TKey, TValue> d1, Dictionary<TKey, TValue> d2)
where TValue : IComparable
{
Dictionary<TKey, TValue> result = new Dictionary<TKey, TValue>();
foreach (TKey key in d1.Keys) {
if (d2.ContainsKey(key))
{
dynamic a = d1[key];
dynamic b = d2[key];
result[key] = a + b;
}
else
result[key] = d1[key];
}
foreach (TKey key in d2.Keys) {
if (!result.ContainsKey(key))
result[key] = d2[key];
}
return result;
}
推荐阅读
- python - 如何使用 python 解析 rdf* 文件?rdflib 是否支持 rdf*?
- rust - Rust:有没有办法缩短 `from_request` 的 `if/else` 部分?
- load-balancing - 在 HAProxy tcp 模式下启用 stats uri 页面
- cakephp - 由于内部应用程序错误导致的 CORS 错误
- php - 如何在 Laravel 项目中加载另一个 Console/Kernel.php?
- c# - EF Core 5,如何定义多个“一对多”关系?
- conda - 将 Snakemake 的 conda 环境移动到另一个位置
- python - 如何根据优先级顺序替换数据框列?
- javascript - 带有机车平滑滚动库的浏览器原生滚动条不是自定义的
- c# - 将字符串数组拆分为组