如何摆脱try/catch并改进C#查询



我有两个列表ModelAModelB以及下面的示例数据,

public class ModelA
{
public string ModelAName { get; set; }
public DateTime ModelATime { get; set; }
}

public class ModelB
{
public string ModelBName { get; set; }
public DateTime ModelBMinTime { get; set; }
public DateTime ModelBMaxTime { get; set; }
}

样本数据,

var lstModelA = new List<ModelA>
{
new ModelA { ModelAName ="A1", ModelATime = new DateTime(2021, 04, 30)},
new ModelA { ModelAName ="A2", ModelATime = new DateTime(2021, 04, 29)},
new ModelA { ModelAName ="A6", ModelATime = new DateTime(2021, 03, 03)}
};

var lstModelB = new List<ModelB>
{
new ModelB { ModelBName ="A1", ModelBMinTime = new DateTime(2021, 01, 01), ModelBMaxTime = new DateTime(2021, 05, 05)},
new ModelB { ModelBName ="A2", ModelBMinTime = new DateTime(2021, 01, 01), ModelBMaxTime = new DateTime(2021, 04, 29)},
new ModelB { ModelBName ="A4", ModelBMinTime = new DateTime(2021, 04, 04), ModelBMaxTime = new DateTime(2021, 04, 05)}
};    

我需要比较ModelBModelA,其中

  • 如果ModelBName未在ModelAName中退出,我希望以相同的ModelBMinTimeModelBMaxTime时间返回此记录。(示例:A4(

  • 如果是ModelBName = ModelANameModelATime = ModelBMaxTime,那么我不想返回这个。(示例"A2"(

    var a= lstModelA.First(x => x.ModelAName == "A2").ModelATime;
    var b = lstModelB.First(x => x.ModelBName == "A2").ModelBMaxTime;
    

    这里a=b!

  • 如果是ModelBName = ModelANameModelATime != ModelBMaxTime,那么我想返回这个结果,但返回ModelBMinTime should be replace with = ModelATime。(示例A1(

我尝试了这个,循环每个ModelB,还尝试/catch,因为lstModelA中存在一些ModelB(A4(nt,如何消除它并改进它?

var data = new List<ModelB>();
foreach (var modelB in lstModelB)
{
try
{
var modelA = lstModelA.First(x => x.ModelAName == modelB.ModelBName);
if (modelA.ModelATime != modelB.ModelBMaxTime)
{
data.Add(new ModelB { ModelBName = modelB.ModelBName, ModelBMinTime = modelA.ModelATime, ModelBMaxTime = modelB.ModelBMaxTime });
}
}
catch (Exception)
{
data.Add(new ModelB { ModelBName = modelB.ModelBName, ModelBMinTime = modelB.ModelBMinTime, ModelBMaxTime = modelB.ModelBMaxTime });
}
}

尝试使用.FirstOrDefault(),然后检查变量的null

var modelA = lstModelA.FirstOrDefault(x => x.ModelAName == modelB.ModelBName);
if (modelA == null)
{
// not found / does not exist
}
else
{
// found
}

您只需要进行一次空检查,而不是在我所能看到的中尝试catch

var modelA = lstModelA.FirstOrDefault(x => x.ModelAName == modelB.ModelBName);
if (modelA != null && modelA.ModelATime != modelB.ModelBMaxTime)
{
data.Add(new ModelB 
{ 
ModelBName = modelB.ModelBName, 
ModelBMinTime = modelA.ModelATime, 
ModelBMaxTime = modelB.ModelBMaxTime 
});
}
else if (modelA == null)
{
data.Add(new ModelB 
{ 
ModelBName = modelB.ModelBName, 
ModelBMinTime = modelB.ModelBMinTime, 
ModelBMaxTime = modelB.ModelBMaxTime 
});
} 

但是,如果modelB可能为null,您也需要检查它。

如果您不处理静态列表,并且它们会增长到更大的大小,那么联接会给您带来更好的性能。

var data =
(from mb in lstModelB
join ma in lstModelA on
mb.ModelBName equals ma.ModelAName
into gj
from sma in gj.DefaultIfEmpty()
where sma is null || sma.ModelATime != mb.ModelBMaxTime
select new ModelB
{
ModelBName = mb.ModelBName,
ModelBMinTime = sma?.ModelATime ?? mb.ModelBMinTime,
ModelBMaxTime = mb.ModelBMaxTime
})
.ToList();

最新更新