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

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],
        });
    }
}

我知道重复代码不是一个很好的做法,但是...目前已经足够了。