我正在尝试调试开发人员编写的代码,LINQ表达式使任务变得痛苦。我不知道如何调试复杂的LINQ表达式,所以任何人都可以告诉我没有它们的等效代码是什么?
instanceIdList.AddRange(
strname.Instances
.Where(z => instancehealthList.Find(y => y.InstanceId == z.InstanceId
&& y.State == "InService") != null)
.Select(x => x.InstanceId)
.ToList()
.Select(instanceid => new ServerObj(servertype, instanceid))
);
这也写得好吗?一般来说,这种LINQ是鼓励还是不赞成的?
答案 0 :(得分:5)
使用循环重构查询看起来像这样:
var serverObjList = new List<ServerObj>();
foreach (var inst in strname.Instances)
{
foreach (var health in instancehealthList)
{
if (inst.InstanceID == health.InstanceID && health.State == "InService")
{
serverObjList.Add(new ServerObj(servertype, health.InstanceID));
break;
}
}
}
答案 1 :(得分:2)
不是将其重写为一系列foreach
循环,而是可以在每次操作后急切地执行表达式,允许您在中间步骤检查数据集,如下所示:
List<var> soFar = strname.Instances.Where(z => instancehealthList.Find(y => y.InstanceId == z.InstanceId && y.State == "InService") != null).ToList();
List<Int64> soFar2 = soFar.Select( x => x.InstanceId ).ToList();
List<ServerObj> soFar3 = soFar2.Select( instanceId => new ServerObj(servertype, instanceid) ).ToList();
instanceIdList.AddRange( soFar3 );
当然,我觉得Linq写得不好。