Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试在if语句中添加不同的类型_C#_.net_Linq_.net Core_Refactoring - Fatal编程技术网

C# 尝试在if语句中添加不同的类型

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

我有一个下面的方法,我循环通过id列表,根据id从db获取数据,然后创建材质,然后添加到材质列表

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