我有两个列表ModelA
和ModelB
以及下面的示例数据,
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)}
};
我需要比较ModelB
和ModelA
,其中
如果
ModelBName
未在ModelAName
中退出,我希望以相同的ModelBMinTime
和ModelBMaxTime
时间返回此记录。(示例:A4
(如果是
ModelBName = ModelAName
和ModelATime = ModelBMaxTime
,那么我不想返回这个。(示例"A2"(var a= lstModelA.First(x => x.ModelAName == "A2").ModelATime; var b = lstModelB.First(x => x.ModelBName == "A2").ModelBMaxTime;
这里a=b!
如果是
ModelBName = ModelAName
和ModelATime != 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();