Asp.net C#是否有更好的方法根据记录计数动态分配值?
我们的表中有1-7级,我们希望能够动态地用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;
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如果OrgPath有1个元素,则代码>失败?@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"
}