Asp.net C#是否有更好的方法根据记录计数动态分配值?

Asp.net C#是否有更好的方法根据记录计数动态分配值?,c#,C#,我们的表中有1-7级,我们希望能够动态地用c#填写,这取决于有多少级。目前我们有这个,但对我来说有点乱。有更好的方法吗 switch (OrgPath.Count) { case 1: budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId; break; case 2: budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId;

我们的表中有1-7级,我们希望能够动态地用c#填写,这取决于有多少级。目前我们有这个,但对我来说有点乱。有更好的方法吗

switch (OrgPath.Count)
{
    case 1:
        budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId;
        break;
    case 2:
        budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId;
        budgetRequest.Level2NodeId = OrgPath[2].LevelNodeId;
        break;
    case 3:
        budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId;
        budgetRequest.Level2NodeId = OrgPath[2].LevelNodeId;
        budgetRequest.Level3NodeId = OrgPath[3].LevelNodeId;
        break;
    case 4:
        budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId;
        budgetRequest.Level2NodeId = OrgPath[2].LevelNodeId;
        budgetRequest.Level3NodeId = OrgPath[3].LevelNodeId;
        budgetRequest.Level4NodeId = OrgPath[4].LevelNodeId;
        break;
    case 5:
        budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId;
        budgetRequest.Level2NodeId = OrgPath[2].LevelNodeId;
        budgetRequest.Level3NodeId = OrgPath[3].LevelNodeId;
        budgetRequest.Level4NodeId = OrgPath[4].LevelNodeId;
        budgetRequest.Level5NodeId = OrgPath[5].LevelNodeId;
        break;
    case 6:
        budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId;
        budgetRequest.Level2NodeId = OrgPath[2].LevelNodeId;
        budgetRequest.Level3NodeId = OrgPath[3].LevelNodeId;
        budgetRequest.Level4NodeId = OrgPath[4].LevelNodeId;
        budgetRequest.Level5NodeId = OrgPath[5].LevelNodeId;
        budgetRequest.Level6NodeId = OrgPath[6].LevelNodeId;
        break;
    case 7: 
        budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId;
        budgetRequest.Level2NodeId = OrgPath[2].LevelNodeId;
        budgetRequest.Level3NodeId = OrgPath[3].LevelNodeId;
        budgetRequest.Level4NodeId = OrgPath[4].LevelNodeId;
        budgetRequest.Level5NodeId = OrgPath[5].LevelNodeId;
        budgetRequest.Level6NodeId = OrgPath[6].LevelNodeId;
        budgetRequest.Level7NodeId = OrgPath[7].LevelNodeId;
        break;
}

不要为每个级别都有一个显式属性(
Level1NodeId
Level2NodeId
,等等),而是创建一个
字典
属性:

public Dictionary<int, WhateverTypeId> LevelNodeIds { get; set; }

如果可能的话,我建议尝试重新设计
budgetRequest
类以使用ID集合。然而,即使在您的情况下这是不可能的,您仍然可以保持代码相对干净

简单的方法是:去掉开关,只需使用一系列
if
语句:

if (OrgPath.Count >= 1)
  budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId;
if (OrgPath.Count >= 2)
  budgetRequest.Level2NodeId = OrgPath[2].LevelNodeId;
if (OrgPath.Count >= 3)
  budgetRequest.Level3NodeId = OrgPath[3].LevelNodeId;
if (OrgPath.Count >= 4)
  budgetRequest.Level4NodeId = OrgPath[4].LevelNodeId;
if (OrgPath.Count >= 5)
  budgetRequest.Level5NodeId = OrgPath[5].LevelNodeId;
if (OrgPath.Count >= 6)
  budgetRequest.Level6NodeId = OrgPath[6].LevelNodeId;
if (OrgPath.Count >= 7)
  budgetRequest.Level7NodeId = OrgPath[7].LevelNodeId;
或者更高级的方法--使用setter数组:

var setters = new Action<string>[] {
    x => budgetRequest.Level1NodeId = x,
    x => budgetRequest.Level2NodeId = x,
    x => budgetRequest.Level3NodeId = x,
    x => budgetRequest.Level4NodeId = x,
    x => budgetRequest.Level5NodeId = x,
    x => budgetRequest.Level6NodeId = x,
    x => budgetRequest.Level7NodeId = x,
};

for (var i = 0; i < OrgPath.Count; i++) {
    setters[i](OrgPath[i + 1].LevelNodeId);
}
var setters=新操作[]{
x=>budgetRequest.Level1NodeId=x,
x=>budgetRequest.Level2NodeId=x,
x=>budgetRequest.Level3NodeId=x,
x=>budgetRequest.Level4NodeId=x,
x=>budgetRequest.Level5NodeId=x,
x=>budgetRequest.Level6NodeId=x,
x=>budgetRequest.Level7NodeId=x,
};
对于(变量i=0;i
有点过分——使用(我不推荐使用这个,因为它有点混乱、脆弱,而且性能也不是特别好):

for(变量i=0;i
关于索引的注意事项 C#的集合使用从0开始的索引

switch (OrgPath.Count)
{
    case 1:
        budgetRequest.Level1NodeId = OrgPath[1].LevelNodeId;
可能需要更改为

switch (OrgPath.Count)
{
    case 1:
        budgetRequest.Level1NodeId = OrgPath[0].LevelNodeId;
A.如果BudgetRequest可以更改 预算请求类可以在集合中存储级别节点ID

考虑以下代码段

class BudgetRequest {
    public int[] LevelNodeIds {get; set;}
}

(...)

var budgetRequest = new BudgetRequest() 
{
    LevelNodeIds = new int[OrgPath.Count]
};
for(int i = 0; i < OrgPath.Count; i++) {
    budgetRequest.LevelNodeIds[i] = OrgPath[i].LevelNodeId;
}
范例

var OrgPath = new[]{
    new { LevelNodeId = "A1" },
    new { LevelNodeId = "B2" },
    new { LevelNodeId = "C3" },
    new { LevelNodeId = "D4" },
    new { LevelNodeId = "E5" },
    new { LevelNodeId = "F6" },
    new { LevelNodeId = "G7" },
    new { LevelNodeId = "H8" },
}.ToList();

var budgetRequest = new BudgetRequest();
switch (OrgPath.Count)
{
    case 7: budgetRequest.Level7NodeId = OrgPath[6].LevelNodeId; goto case 6;
    case 6: budgetRequest.Level6NodeId = OrgPath[5].LevelNodeId; goto case 5;
    case 5: budgetRequest.Level5NodeId = OrgPath[4].LevelNodeId; goto case 4;
    case 4: budgetRequest.Level4NodeId = OrgPath[3].LevelNodeId; goto case 3;
    case 3: budgetRequest.Level3NodeId = OrgPath[2].LevelNodeId; goto case 2;
    case 2: budgetRequest.Level2NodeId = OrgPath[1].LevelNodeId; goto case 1;
    case 1: budgetRequest.Level1NodeId = OrgPath[0].LevelNodeId; break;
    default: goto case 7;
}

Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(budgetRequest, new System.Text.Json.JsonSerializerOptions{WriteIndented = true}));   
输出

{
  "Level1NodeId": "A1",
  "Level2NodeId": "B2",
  "Level3NodeId": "C3",
  "Level4NodeId": "D4",
  "Level5NodeId": "E5",
  "Level6NodeId": "F6",
  "Level7NodeId": "G7"
}

我会选择简单的方法,因为它更易于维护,谢谢。这是答案,但如果(OrgPath.Count>=1)budgetRequest.Level1NodeId=OrgPath[1].LevelNodeId失败?@tymtam我猜您的意思是,因为对于数组(和大多数其他集合),索引从零开始。是的,您可能是对的,但是,在某些情况下,您可能仍然需要与使用base-1集合的系统或库进行交互。我假设OP的原始代码在将
OrgPath
的索引偏移1时是正确的。这可能是OP的代码的另一个问题,但它似乎超出了这个问题的范围。在这漫长的一天结束时,我觉得自己真的很傻。。。我的答案使用了字典,我刚刚意识到完全没有必要,因为
BudgetRequest
是一个具有显式列名的表,如
Level1NodeId
Level2NodeId
,等等。我们不需要通过名称显式分配它吗?
class BudgetRequest {
    public int[] LevelNodeIds {get; set;}
}

(...)

var budgetRequest = new BudgetRequest() 
{
    LevelNodeIds = new int[OrgPath.Count]
};
for(int i = 0; i < OrgPath.Count; i++) {
    budgetRequest.LevelNodeIds[i] = OrgPath[i].LevelNodeId;
}
switch (OrgPath.Count)
{
    case 7: budgetRequest.Level7NodeId = OrgPath[6].LevelNodeId; goto case 6;
    case 6: budgetRequest.Level6NodeId = OrgPath[5].LevelNodeId; goto case 5;
    case 5: budgetRequest.Level5NodeId = OrgPath[4].LevelNodeId; goto case 4;
    case 4: budgetRequest.Level4NodeId = OrgPath[3].LevelNodeId; goto case 3;
    case 3: budgetRequest.Level3NodeId = OrgPath[2].LevelNodeId; goto case 2;
    case 2: budgetRequest.Level2NodeId = OrgPath[1].LevelNodeId; goto case 1;
    case 1: budgetRequest.Level1NodeId = OrgPath[0].LevelNodeId; break;
    default: goto case 7;
}
var OrgPath = new[]{
    new { LevelNodeId = "A1" },
    new { LevelNodeId = "B2" },
    new { LevelNodeId = "C3" },
    new { LevelNodeId = "D4" },
    new { LevelNodeId = "E5" },
    new { LevelNodeId = "F6" },
    new { LevelNodeId = "G7" },
    new { LevelNodeId = "H8" },
}.ToList();

var budgetRequest = new BudgetRequest();
switch (OrgPath.Count)
{
    case 7: budgetRequest.Level7NodeId = OrgPath[6].LevelNodeId; goto case 6;
    case 6: budgetRequest.Level6NodeId = OrgPath[5].LevelNodeId; goto case 5;
    case 5: budgetRequest.Level5NodeId = OrgPath[4].LevelNodeId; goto case 4;
    case 4: budgetRequest.Level4NodeId = OrgPath[3].LevelNodeId; goto case 3;
    case 3: budgetRequest.Level3NodeId = OrgPath[2].LevelNodeId; goto case 2;
    case 2: budgetRequest.Level2NodeId = OrgPath[1].LevelNodeId; goto case 1;
    case 1: budgetRequest.Level1NodeId = OrgPath[0].LevelNodeId; break;
    default: goto case 7;
}

Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(budgetRequest, new System.Text.Json.JsonSerializerOptions{WriteIndented = true}));   
{
  "Level1NodeId": "A1",
  "Level2NodeId": "B2",
  "Level3NodeId": "C3",
  "Level4NodeId": "D4",
  "Level5NodeId": "E5",
  "Level6NodeId": "F6",
  "Level7NodeId": "G7"
}