0

我有一个 BoxPair 类型的静态公共列表,我正在尝试向其中写入内容,但每次我向其中添加新条目时,它都会更改每条记录。我希望有人能看到这里出了什么问题,因为它让我有点发疯。完整的添加代码如下:

public static List<BoxPair> CreateBoxPair (int iBoxCount)
{
    SetTopBox primary;
    SetTopBox backup;

    for (int i = 0; i < iBoxCount; i++)
    {
        primary = new SetTopBox();
        backup = new SetTopBox();

        primary.IBoxNumber = i;             
        primary.SDeviceName = "Box" + (i + 1).ToString("00");
        primary.Role = Box.ROLE_PRIMARY;

        backup.IBoxNumber = i;
        backup.SDeviceName = "Box" + (i + 1).ToString("00");
        backup.Role = Role.ROLE_BACKUP;

        lstBoxes.Add(new BoxPair(primary, Role));
        lstBoxes.Add(new BoxPair(backup, Role));

        foreach (BoxPair p in lstBoxes)
        {
            Declarations.BOXES.Add(p);
        }             
    }                        

    return lstBoxes;
}

我知道这将是一些基本的东西,但据我所知,我一直在使用新的主/备份盒,所以没有什么冲突。任何想法将不胜感激。

干杯。

PS我发的每一篇文章,都会删除第一个单词,所以我必须输入两次。关于为什么会发生这种情况的任何想法?

编辑:由于下面列出的所有方法都给出了相同的结果,我猜这是一个无法解决的问题。因此,我将回到绘图板上尝试以不同的方式处理这个问题。感谢所有的帮助,无论如何,伙计们:)

4

3 回答 3

2

从评论中,我对有效代码的最佳选择如下:

public static List<BoxPair> CreateBoxPair (int iBoxCount)
{
    for (int i = 0; i < iBoxCount; i++)
    {
        var primary = new SetTopBox();
        var backup = new SetTopBox();

        primary.IBoxNumber = i;             
        primary.SDeviceName = "Box" + (i + 1).ToString("00");
        primary.Role = Box.ROLE_PRIMARY;

        backup.IBoxNumber = i;
        backup.SDeviceName = "Box" + (i + 1).ToString("00");
        backup.Role = Role.ROLE_BACKUP;

        var primaryPair = new BoxPair(primary, Role);
        var backupPair = new BoxPair(backup, Role);

        lstBoxes.Add(primaryPair);
        lstBoxes.Add(backupPair);

        Declarations.BOXES.Add(primaryPair);
        Declarations.BOXES.Add(backupPair);
    }                        

    return lstBoxes;
}

我认为原始代码中有两个问题:

  • primarybackup在循环外声明。
  • 循环内的foreach循环多次将条目添加到另一个集合。
于 2012-08-06T10:35:53.813 回答
1

代替

lstBoxes.Add(new BoxPair(primary, Role));
lstBoxes.Add(new BoxPair(backup, Role));

foreach (BoxPair p in lstBoxes)
{
    Declarations.BOXES.Add(p);
}  

这样:

var p1 = new BoxPair(primary, Role);
var p2 = new BoxPair(backup, Role);
lstBoxes.Add(p1);
lstBoxes.Add(p2);
Declarations.BOXES.Add(p1);
Declarations.BOXES.Add(p2);
于 2012-08-06T10:44:26.993 回答
0

我认为您只是缺少 lstBoxes var 声明,List<BoxPair> lstBoxes = new List<BoxPair>;.

public static List<BoxPair> CreateBoxPair (int iBoxCount)
{
    SetTopBox primary;
    SetTopBox backup;

    List<BoxPair> lstBoxes = new List<BoxPair>();

    for (int i = 0; i < iBoxCount; i++)
    {
        primary = new SetTopBox();
        backup = new SetTopBox();

        primary.IBoxNumber = i;             
        primary.SDeviceName = "Box" + (i + 1).ToString("00");
        primary.Role = Box.ROLE_PRIMARY;

        backup.IBoxNumber = i;
        backup.SDeviceName = "Box" + (i + 1).ToString("00");
        backup.Role = Role.ROLE_BACKUP;

        lstBoxes.Add(new BoxPair(primary, Role));
        lstBoxes.Add(new BoxPair(backup, Role));

        foreach (BoxPair p in lstBoxes)
        {
            Declarations.BOXES.Add(p);
        }             
    }                        

    return lstBoxes;
}

如果 lstBoxes 是一个不需要在函数中的公共变量,则不要返回它:

public static Void CreateBoxPair (int iBoxCount)
    {
        SetTopBox primary;
        SetTopBox backup;

        for (int i = 0; i < iBoxCount; i++)
        {
            primary = new SetTopBox();
            backup = new SetTopBox();

            primary.IBoxNumber = i;             
            primary.SDeviceName = "Box" + (i + 1).ToString("00");
            primary.Role = Box.ROLE_PRIMARY;

            backup.IBoxNumber = i;
            backup.SDeviceName = "Box" + (i + 1).ToString("00");
            backup.Role = Role.ROLE_BACKUP;

            lstBoxes.Add(new BoxPair(primary, Role));
            lstBoxes.Add(new BoxPair(backup, Role));

            foreach (BoxPair p in lstBoxes)
            {
                Declarations.BOXES.Add(p);
            }             
        }                        
    }
于 2012-08-06T10:33:37.783 回答