我的一个开发人员朋友告诉我,使用代理循环要快得多,而且我想对它进行基准测试,但是我无法将它们的工作原理连接起来.
考虑以下平衡计算器.这基本上是一个帐户列表,如果它存在,则将初始值(起始余额)添加到总信用值(如果存在)并减去每个帐户的总借方值:
private static IDictionary<string, decimal> CalculateBalances(
IDictionary<string, decimal> initialValue,
IDictionary<string, decimal> credits,
IDictionary<string, decimal> debits)
{
var r = new Dictionary<string, decimal>();
foreach (var key in initialValue.Select(k => k.Key)
.Concat(credits.Select(k => k.Key))
.Concat(debits.Select(k => k.Key))
.Distinct())
{
r.Add(key,
(initialValue.ContainsKey(key) ? initialValue[key] : 0M)
+ (credits.ContainsKey(key) ? credits[key] : 0M)
- (debits.ContainsKey(key) ? debits[key] : 0M)
);
}
return r;
}
Run Code Online (Sandbox Code Playgroud)
这在中小型帐户列表中是相当高效的,但使用委托会更快吗?坦率地说,委托逻辑似乎与我的思维过程正确地运作,因为我正在摸不着如何写这个.
任何人都可以提供一种使用委托重写这个的方法吗?
我假设你的朋友指的是类上的ForEach方法List<T>.对你的问题的简短回答是否定的.
等效的语法是:
initialValue.Select(k => k.Key)
.Concat(credits.Select(k => k.Key))
.Concat(debits.Select(k => k.Key))
.Distinct()
.ToList()
.ForEach(var => r.Add(key,
(initialValue.ContainsKey(key) ? initialValue[key] : 0M)
+ (credits.ContainsKey(key) ? credits[key] : 0M)
- (debits.ContainsKey(key) ? debits[key] : 0M)
));
Run Code Online (Sandbox Code Playgroud)
这绝不比你上面的方式更好.它既慢又难以阅读.委托调用比普通方法调用慢.您上面的语法更快,更容易阅读.
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |