列表会在更新时覆盖每个条目

时间:2012-08-06 10:25:41

标签: c# list

我有一个类型为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;
}

我知道这将是一个基本的东西,但从我所看到的,我总是使用一个新的主/备用盒,所以没有什么可以冲突。任何想法都将不胜感激。

干杯。

P.S。我发的每个帖子都删除了第一个单词,所以我必须输入两次。关于为什么会发生这种情况的任何想法?

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

3 个答案:

答案 0 :(得分: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循环多次将条目添加到其他集合。

答案 1 :(得分: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);

答案 2 :(得分: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是一个不需要在函数中的公共var,则不返回它:

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