ForEach循环重复行

时间:2015-10-14 17:17:14

标签: c# winforms loops foreach

不知道我做错了什么,但我有一个循环应该在多行文本框中打印15行,并且它打印了10万个(确切地说是32,767)。我有两个类:我的表单类(DISMgui.cs)和我的逻辑类(DISM.cs)。

Form有一个文件框(txtWimFile)用于文件,一个按钮(btnMount),一个后台工作者(bwMountWim)和一个用于输出的ML文本框(txtOutput)。

场景:在txtWimFile中键入文件的名称(例如C:\ Temp \ Win7x64.wim)。单击btnMount。这会调用bwMountWim.RunWorkerAsync():

private void btnMount_Click(object sender, EventArgs e)
{
    if (!String.IsNullOrEmpty(txtWimFile.Text))
        bwMountWim.RunWorkerAsync();
    else
        MessageBox.Show("WIM file text box returned null!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

从DISM类(ImageInfo)调用方法:

private void bwMountWim_DoWork(object sender, DoWorkEventArgs e)
{
    imageInfo = DISM.ImageInfo(GetTxtWimFile(), this);
}

ImageInfo使用DismApi收集WIM图像的信息并返回信息:

public static DismImageInfoCollection ImageInfo(string wimFile, DISMgui that)
{
    DismImageInfoCollection info = null;

    try
    {
        info = DismApi.GetImageInfo(wimFile);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString(), "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    return info;
}

后台工作者RunWorkerCompleted将信息返回到txtOutput.Text:

private void bwMountWim_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    foreach (DismImageInfo info in imageInfo)
    {
        Output = "";
        Output += "Image information for image " + WimFile + System.Environment.NewLine;
        Output += System.Environment.NewLine;
        Output += String.Format("Image index         : {0}" + System.Environment.NewLine, info.ImageIndex.ToString());
        Output += String.Format("Image name          : {0}" + System.Environment.NewLine, info.ImageName.ToString());
        Output += String.Format("Image Internal Size : {0} MB" + System.Environment.NewLine, (info.ImageSize / 1048576).ToString("N0"));
        Output += String.Format("Image Description   : {0}" + System.Environment.NewLine, info.ImageDescription.ToString());
        Output += String.Format("Image Type          : {0}" + System.Environment.NewLine, info.ImageType.ToString());
        Output += String.Format("Image Installation  : {0}" + System.Environment.NewLine, info.InstallationType.ToString());
        Output += String.Format("Image Prod Name     : {0}" + System.Environment.NewLine, info.ProductName.ToString());
        Output += String.Format("Image Prod Suite    : {0}" + System.Environment.NewLine, info.ProductSuite.ToString());
        Output += String.Format("Image Prod Type     : {0}" + System.Environment.NewLine, info.ProductType.ToString());
        Output += String.Format("Image Prod Version  : {0}" + System.Environment.NewLine, info.ProductVersion.ToString());
        Output += String.Format("Image Bootable      : {0}" + System.Environment.NewLine, info.Bootable.ToString());
        Output += String.Format("Image Architecture  : {0}" + System.Environment.NewLine, info.Architecture.ToString());
        Output += String.Format("Image Edition ID    : {0}" + System.Environment.NewLine, info.EditionId.ToString());

    }

    txtOutput.Text = Output;
}

DismApi设置为能够处理具有多个索引的WIM,尽管我通常使用的WIM只有一个。

我理解逻辑的方式,应该只有一个" info"对象在" imageInfo"中,因此只运行一次循环。但是,我已经返回超过30,000行(请参阅here,对于pastebin来说太多了)。具有讽刺意味的是,最后15行完全是应该的样子。

如果有人能够解释为什么这么做,以及我能做些什么来解决它,我会很感激。我觉得它有点愚蠢。

Output属性的代码:

public string Output
{
    get { return output; }
    set
    {
        if (!String.IsNullOrEmpty(value))
        {
            output += value;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

所以我询问Output的原因是我想知道它是一个简单的字符串还是内部有其他内容的属性。你的" setter"搞砸了你。

这是您的财产,来自您的评论:

public string Output
{
    get { return output; }
    set
    {
        if (!String.IsNullOrEmpty(value))
        {
            output += value;
        }
    }
}

首先,你像这样连接到Output。如果它是一个简单的字符串,一切都很好。

Output += String.Format(...);

但是,感谢+=,你基本上是这样做的:

Output = Output + String.Format(...);
         ^^^^^^^^^^^^^^ // all of that is the "value" your passing into the property

换句话说:

if (!String.IsNullOrEmpty(value))
{
    // The value of "value" is everything that was in output,
    // plus the additional string, which gets tacked on to the end of "output"
    output += value;
}

要解决此问题,您必须对此进行重新设计。例如,在属性设置器或+=循环中删除其中一个foreach

我想我会用StringBuilder替换属性:

var output = new StringBuilder();
output.AppendLine("Image information for image " + WimFile);
output.AppendLine("");
output.AppendLine("");
output.AppendLine(String.Format("Image index         : {0}", info.ImageIndex.ToString()));
...
...
txtOutput.Text = output.ToString();