我有两个自定义对象列表,如果另一个列表中有一个与另一对字段匹配的对象,我想更新一个列表中所有对象的字段。
这段代码更好地解释了问题并产生了我想要的结果。然而,对于较大的 20k 列表和具有匹配对象的 20k 列表,这需要相当长的时间(31 秒)。通过使用通用列表 Find(Predicate) 方法,我可以将这一点提高约 50%。
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;
namespace ExperimentFW3
{
public class PropValue
{
public string Name;
public decimal Val;
public decimal Total;
}
public class Adjustment
{
public string PropName;
public decimal AdjVal;
}
class Program
{
static List<PropValue> propList;
static List<Adjustment> adjList;
public static void Main()
{
propList = new List<PropValue>{
new PropValue{Name = "Alfa", Val=2.1M},
new PropValue{Name = "Beta", Val=1.0M},
new PropValue{Name = "Gamma", Val=8.0M}
};
adjList = new List<Adjustment>{
new Adjustment{PropName = "Alfa", AdjVal=-0.1M},
new Adjustment{PropName = "Beta", AdjVal=3M}
};
foreach (var p in propList)
{
Adjustment a = adjList.SingleOrDefault(
av => av.PropName.Equals(p.Name)
);
if (a != null)
p.Total = p.Val + a.AdjVal;
else
p.Total = p.Val;
}
}
}
}
期望的结果是:Alfa total=2,Beta total=4,Gamma total=8
但我想知道这是否有可能做得更快。即使在结果集中循环超过 20k 个项目时,内部加入这两个列表也需要很少的时间。
var joined = from p in propList
join a in adjList on p.Name equals a.PropName
select new { p.Name, p.Val, p.Total, a.AdjVal };
所以我的问题是,是否有可能像使用 T-SQL 那样做一些事情?对调整值使用 ISNULL(val,0) 的左连接的 UPDATE。