如何更正多维数组上的迭代
How to correct a iteration on a Multidimensional array
我有一个table"recipientMap"。这个 table 看起来像这样:
| MapID | IPgroupID | PCgroupID | AlertID
|:------|----------:|:---------:|:------:
| 1 | 1 | 1 | 15
| 2 | 3 | null | 15
| 3 | 3 | null | 16
这 table 帮助我知道谁可以访问消息。
当用户从 Mvc 应用程序编写警报时完成此选择,每个警报都有一个复选框列表。因此,我为检查的 IP 组 ID 和检查的 PC 组 ID 构建了一个数组,并将两者推入一个新的多维数组。我将这个数组发送到控制器。下一步是对其进行迭代,并基于 RecipientMap 模型构建列表。
问题是当其中一个列表或多或少地检查了 id 时。例如,如果我的多维数组中有这样的结果:
list[0][0]=1
list[0][1]=3
list[1][0]=1
我得到一个错误,因为没有 list[1][1]
。我的列表必须具有相同的长度...这不好,我知道这是因为我的迭代方法不正确,我需要一些建议来更正它。
List[0][x]
用于 IP,List[1][x]
用于 PC。我的数组可能有一个或两个列表。
$('#bttn').click(function () {
var brutelistip = null;
brutelistip = [];
var brutelistpc = null;
brutelistpc = [];
$('#AlertCreationTabs #AlertCreationTabs-1 input:checkbox:checked').each(function () {
brutelistip.push($(this).attr('value'));
});
$('#AlertCreationTabs #AlertCreationTabs-2 input:checkbox:checked').each(function () {
brutelistpc.push($(this).attr('value'));
});
var recipientlist = new Array();
recipientlist[0] = brutelistip;
recipientlist[1] = brutelistpc;
$.ajax({
url: '/Panels/CreateNewAlert',
dataType: 'json',
type: 'post',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({
...
list: recipientlist,
}),
async: false,
processData: true,
success: function (data) {
alert(data);
},
error: function (xhr) {
alert('error');
}
});
});
控制器:
public JsonResult CreateNewAlert(AlertMap alertMap, AlertLog alertLog, RecipientMap recipientMap, int[][] list)
{
if (ModelState.IsValid)
{
...
var RM = new RecipientMap();
List<RecipientMap>reciplist = new List<RecipientMap>();
for (int i = 0; i < list.Length; i++)
{
reciplist.Add(new RecipientMap
{
IPgroupID = list[0][i],
PCgroupID = list[1][i]
});
}
AL.RecipientMap.AddRange(reciplist);
AL.AlertMap.Add(AM);
db.AlertLog.Add(AL);
db.SaveChanges();
}
...
}
假设 list[0]
和 list[1]
的长度相同,那么将 list.Length
替换为 list[0].Length
可能是明智的:
for (int i = 0; i < list[0].Length; i++)
{
reciplist.Add(new RecipientMap
{
IPgroupID = list[0][i],
PCgroupID = list[1][i]
});
}
如果它们的长度不同,您将必须在访问一个或另一个之前进行条件检查。这两种解决方案都有点繁琐,但它们都适用于不同的情况。
其中一个存在而另一个不存在,您可以将 null
插入 RecipientMap
属性之一以创建 List<RecipientMap>
元素..或者您无法创建它根本。这完全取决于您的实施。
谢谢,我找到了解决办法!首先,我希望为 ip 列表保留 [0],为 pc 列表保留 [1]。所以我添加了一个 if 语句,如果没有选中的项目则推送 0。
if ($('#AlertCreationTabs #AlertCreationTabs-1 input:checkbox:checked').length > 0)
{
$('#AlertCreationTabs #AlertCreationTabs-1 input:checkbox:checked').each(function () {
brutelistip.push($(this).attr('value'));
});
} else {
brutelistip.push(0);
}
if ($('#AlertCreationTabs #AlertCreationTabs-2 input:checkbox:checked').length > 0)
{
$('#AlertCreationTabs #AlertCreationTabs-2 input:checkbox:checked').each(function () {
brutelistpc.push($(this).attr('value'));
});
} else {
brutelistpc.push(0);
}
然后在控制器中
if (list[0][0]!=0)
{
for (int i = 0; i < list[0].Length; i++)
{
reciplist.Add(new RecipientMap
{
IPgroupID = list[0][i],
});
}
}
if (list[1][0]!=0)
{
for (int j = 0; j < list[1].Length; j++)
{
reciplist.Add(new RecipientMap
{
PCgroupID = list[1][j],
});
}
}
我知道重复代码不是一个很好的做法,但是...目前已经足够了。
我有一个table"recipientMap"。这个 table 看起来像这样:
| MapID | IPgroupID | PCgroupID | AlertID
|:------|----------:|:---------:|:------:
| 1 | 1 | 1 | 15
| 2 | 3 | null | 15
| 3 | 3 | null | 16
这 table 帮助我知道谁可以访问消息。
当用户从 Mvc 应用程序编写警报时完成此选择,每个警报都有一个复选框列表。因此,我为检查的 IP 组 ID 和检查的 PC 组 ID 构建了一个数组,并将两者推入一个新的多维数组。我将这个数组发送到控制器。下一步是对其进行迭代,并基于 RecipientMap 模型构建列表。
问题是当其中一个列表或多或少地检查了 id 时。例如,如果我的多维数组中有这样的结果:
list[0][0]=1
list[0][1]=3
list[1][0]=1
我得到一个错误,因为没有 list[1][1]
。我的列表必须具有相同的长度...这不好,我知道这是因为我的迭代方法不正确,我需要一些建议来更正它。
List[0][x]
用于 IP,List[1][x]
用于 PC。我的数组可能有一个或两个列表。
$('#bttn').click(function () {
var brutelistip = null;
brutelistip = [];
var brutelistpc = null;
brutelistpc = [];
$('#AlertCreationTabs #AlertCreationTabs-1 input:checkbox:checked').each(function () {
brutelistip.push($(this).attr('value'));
});
$('#AlertCreationTabs #AlertCreationTabs-2 input:checkbox:checked').each(function () {
brutelistpc.push($(this).attr('value'));
});
var recipientlist = new Array();
recipientlist[0] = brutelistip;
recipientlist[1] = brutelistpc;
$.ajax({
url: '/Panels/CreateNewAlert',
dataType: 'json',
type: 'post',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({
...
list: recipientlist,
}),
async: false,
processData: true,
success: function (data) {
alert(data);
},
error: function (xhr) {
alert('error');
}
});
});
控制器:
public JsonResult CreateNewAlert(AlertMap alertMap, AlertLog alertLog, RecipientMap recipientMap, int[][] list)
{
if (ModelState.IsValid)
{
...
var RM = new RecipientMap();
List<RecipientMap>reciplist = new List<RecipientMap>();
for (int i = 0; i < list.Length; i++)
{
reciplist.Add(new RecipientMap
{
IPgroupID = list[0][i],
PCgroupID = list[1][i]
});
}
AL.RecipientMap.AddRange(reciplist);
AL.AlertMap.Add(AM);
db.AlertLog.Add(AL);
db.SaveChanges();
}
...
}
假设 list[0]
和 list[1]
的长度相同,那么将 list.Length
替换为 list[0].Length
可能是明智的:
for (int i = 0; i < list[0].Length; i++)
{
reciplist.Add(new RecipientMap
{
IPgroupID = list[0][i],
PCgroupID = list[1][i]
});
}
如果它们的长度不同,您将必须在访问一个或另一个之前进行条件检查。这两种解决方案都有点繁琐,但它们都适用于不同的情况。
其中一个存在而另一个不存在,您可以将 null
插入 RecipientMap
属性之一以创建 List<RecipientMap>
元素..或者您无法创建它根本。这完全取决于您的实施。
谢谢,我找到了解决办法!首先,我希望为 ip 列表保留 [0],为 pc 列表保留 [1]。所以我添加了一个 if 语句,如果没有选中的项目则推送 0。
if ($('#AlertCreationTabs #AlertCreationTabs-1 input:checkbox:checked').length > 0)
{
$('#AlertCreationTabs #AlertCreationTabs-1 input:checkbox:checked').each(function () {
brutelistip.push($(this).attr('value'));
});
} else {
brutelistip.push(0);
}
if ($('#AlertCreationTabs #AlertCreationTabs-2 input:checkbox:checked').length > 0)
{
$('#AlertCreationTabs #AlertCreationTabs-2 input:checkbox:checked').each(function () {
brutelistpc.push($(this).attr('value'));
});
} else {
brutelistpc.push(0);
}
然后在控制器中
if (list[0][0]!=0)
{
for (int i = 0; i < list[0].Length; i++)
{
reciplist.Add(new RecipientMap
{
IPgroupID = list[0][i],
});
}
}
if (list[1][0]!=0)
{
for (int j = 0; j < list[1].Length; j++)
{
reciplist.Add(new RecipientMap
{
PCgroupID = list[1][j],
});
}
}
我知道重复代码不是一个很好的做法,但是...目前已经足够了。