如何纠正多维数组上的迭代



我有一个表"recipientMap"。这个表是这样的:

| MapID | IPgroupID | PCgroupID | AlertID
|:------|----------:|:---------:|:------:
|   1   |     1     |     1     |   15
|   2   |     3     |    null   |   15
|   3   |     3     |    null   |   16

这个表帮助我知道谁可以访问消息。

这个选择是在用户从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();
    }
    ...
}

谢谢,我找到解决方案了!首先,我希望保留[0]的ip列表和[1]的pc列表。因此,我添加了一个if语句,如果没有选中项,则push 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],
        });
    }
}

我知道重复代码不是一个很好的做法,但是…这就够了。

假设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>元素。或者你根本不能创造它。这完全取决于你的实现。

相关内容

  • 没有找到相关文章