C# 尝试在if语句中添加不同的类型
我有一个下面的方法,我循环通过id列表,根据id从db获取数据,然后创建材质,然后添加到材质列表C# 尝试在if语句中添加不同的类型,c#,.net,linq,.net-core,refactoring,C#,.net,Linq,.net Core,Refactoring,我有一个下面的方法,我循环通过id列表,根据id从db获取数据,然后创建材质,然后添加到材质列表 public Construction AddToOsm(Model model, APIDbContext dbContext) { var construction = new Construction(model); var surfaceType = dbContext.IntendedSurfaceTypes.SingleOrDefault(s => s.Id
public Construction AddToOsm(Model model, APIDbContext dbContext)
{
var construction = new Construction(model);
var surfaceType = dbContext.IntendedSurfaceTypes.SingleOrDefault(s => s.Id == this.SurfaceTypeId);
construction.setName(surfaceType?.Name);
using var materials = new MaterialVector();
var fenestrationMaterialById = new Dictionary<Guid, FenestrationMaterial>();
var opaqueMaterialById = new Dictionary<Guid, StandardOpaqueMaterial>();
foreach (var materialId in this.LayerIds.Where(i => i != default))
{
var opaqueMaterial = dbContext.OpaqueMaterials.SingleOrDefault(o => o.Id == materialId);
if (opaqueMaterial != default)
{
materials.Add(opaqueMaterialById.GetOrCreate(opaqueMaterial.Id, () => opaqueMaterial.AddToOsm(model)));
}
else
{
var glazingMaterial = dbContext.GlazingMaterials.SingleOrDefault(o => o.Id == materialId);
if (glazingMaterial != default)
{
materials.Add(fenestrationMaterialById.GetOrCreate(glazingMaterial.Id, () => glazingMaterial.AddToOsm(model)));
}
else
{
var glazingSimpleMaterial = dbContext.SimpleGlazingMaterials.SingleOrDefault(s => s.Id == materialId);
if(glazingSimpleMaterial != default)
{
materials.Add(fenestrationMaterialById.GetOrCreate(glazingSimpleMaterial.Id, () => glazingSimpleMaterial.AddToOsm(model)));
}
else
{
var gasGlazingMaterials = dbContext.GasGlazingMaterials.SingleOrDefault(a => a.Id == materialId);
if(gasGlazingMaterials != default)
{
materials.Add(fenestrationMaterialById.GetOrCreate(gasGlazingMaterials.Id, () => gasGlazingMaterials.AddToOsm(model)));
}
}
}
}
}
construction.setLayers(materials);
return construction;
}
public-Construction-AddToOsm(模型模型,APIDbContext-dbContext)
{
var构造=新构造(模型);
var surfaceType=dbContext.intendesurfacetypes.SingleOrDefault(s=>s.Id==this.SurfaceTypeId);
construction.setName(surfaceType?.Name);
使用var materials=new MaterialVector();
var FINESTRATIONMATERIALBYID=新字典();
var opaqueMaterialById=新字典();
foreach(在此.LayerIds.Where(i=>i!=默认值)中实现的var)
{
var opaqueMaterial=dbContext.OpaqueMaterials.SingleOrDefault(o=>o.Id==materialId);
如果(不透明材质!=默认值)
{
materials.Add(opaqueMaterialById.GetOrCreate(opaqueMaterial.Id,()=>opaqueMaterial.AddToOsm(model));
}
其他的
{
var glazingMaterial=dbContext.GlazingMaterials.SingleOrDefault(o=>o.Id==materialId);
if(玻璃材质!=默认值)
{
materials.Add(windowstrationmaterialbyid.GetOrCreate(glazingMaterial.Id,()=>glazingMaterial.AddToOsm(model));
}
其他的
{
var glazingSimpleMaterial=dbContext.SimpleGrazingMaterials.SingleOrDefault(s=>s.Id==materialId);
if(glazingSimpleMaterial!=默认值)
{
materials.Add(windowstrationmaterialbyid.GetOrCreate(glazingSimpleMaterial.Id,()=>glazingSimpleMaterial.AddToOsm(model));
}
其他的
{
var gasGlazingMaterials=dbContext.gasGlazingMaterials.SingleOrDefault(a=>a.Id==materialId);
if(气体玻璃材质!=默认值)
{
materials.Add(windowstrationmaterialbyid.GetOrCreate(gasGlazingMaterials.Id,()=>gasGlazingMaterials.AddToOsm(model));
}
}
}
}
}
施工.铺筑层(材料);
回归构造;
}
我正在寻找一种方法来避免大部分if-else语句主要重构它,但找不到方法。请任何人就如何实现这一目标提出建议
提前谢谢
更新:示例实体结构
public class GasGlazingMaterial : ISourceOfData, IIdentity<Guid>
{
[Key]
public Guid Id { get; set; }
public string Name { get; set; }
[ForeignKey("SourceOfData")]
public Guid? SourceOfDataId { get; set; }
public virtual CodeStandardGuideline SourceOfData { get; set; }
......
.....
}
公共级气体玻璃材质:ISourceOfData,IIdentity
{
[关键]
公共Guid Id{get;set;}
公共字符串名称{get;set;}
[外键(“数据源”)]
公共Guid?SourceOfDataId{get;set;}
公共虚拟代码源数据{get;set;}
......
.....
}
一个简单的修复方法是在每个materials.add之后“continue”。这意味着您不需要将其余部分嵌入else通常,我使用循环来解决重复的if
函数。如果你列了一个对象列表,并对它们进行迭代,会怎么样?然后,对于每一个,检查如果object=default:exit。其他:继续
。是的,问题是如果对象=默认值
,那么如果第一个对象不可用,我需要检查其他对象。这看起来是对材料“类型”的测试,这使我认为数据结构实际上是问题的根源。我想知道在这里回头看看数据库结构是否是个好主意。它还涉及到这段代码在多个表中测试相同的“ID”,我认为这是另一个危险信号。实际结构如下public class SurfaceConstruction:IIdentity{[Key]public Guid ID{get;set;}public Guid SurfaceTypeId{get;set;}public intendesurfacetype SurfaceType{get;set;}public List LayerIds{get;set;}public Construction AddToOsm(Model Model,APIDbContext dbContext){...
循环遍历层
并找到相应的材质,然后添加到材质和所有材质实体中(OpaqueMaterials…
)源自IIdentity