列出订单(或迭代)故障

时间:2013-05-08 08:50:45

标签: c# list loops

您好我在通过17个标签的列表进行迭代时出现问题:

for (int i = 0; i < labels.Count - 1; i++)
{
    MessageBox.Show(labels[i].Name);
    if (labels[i].Visible == false && labels[i + 1].Visible == true)
    {
        ...

以下是我得到的结果:

首先它从label10转到label17,然后从label9降序到label2

以下是我如何将标签添加到列表中:

private void newGameToolStripMenuItem_Click(object sender, EventArgs e)
{
    foreach (Control c in this.Controls)
    {
        if (c is Label)
        {
            labels.Add(c);
            c.Enabled = true;
            if (c.Visible == false)
            {
                c.Visible = true;
            }
        }
    }
}

我希望它从label1转到label16,因为循环只是一个循环我想问题在于标签添加到列表的顺序,但我不是确定如何解决它。

5 个答案:

答案 0 :(得分:1)

您的主要问题是词典顺序,当您按标签的名称排序时,它本身就会被使用,您希望在术语label之后按数字排序。在这种情况下,首先对标签列表进行排序,然后对其运行for语句,请检查代码:

var lst = labels.OrderBy(x => int.Parse(x.Name.Substring("label".Length))).ToList();
for (int i = 0; i < lst.Count - 1; i++)
{
    MessageBox.Show(lst[i].Name);
    ...

但请记住,此代码很简单,并假设标签Name属性始终以“label”字符串开头。如果可以改变,你必须处理这种情况。

答案 1 :(得分:0)

我想你想根据他们的名字对标签进行排序?

labels.Sort((x, y) => { return x.Name.CompareTo(y.Name); });

但有什么区别:

  1. 首先显示“标签1”,然后显示“标签2”和
  2. 首先显示“标签2”,然后显示“标签1”?

答案 2 :(得分:0)

检查designer.cs文件,查看标签添加到表单的顺序

答案 3 :(得分:0)

假设您的标签ID为Label1,Label2 ..........,Label16 为了连续获取标签,您必须编写以下代码

labels = labels.ConvertAll<Control>(GetIdFromLabel);
labels.Sort((x, y) => { return x.Id.CompareTo(y.Id); });

public Control GetIdFromLabel(Control c)
    {
        c.Id = c.Name.Replace("Label", "") == "" ? 0 : Convert.ToInt32(c.Name.Replace("Label", ""));
        return c;
    }

在您的代码中添加此类

public class Control
{
    public string Name { get; set; }
    public int Id { get; set; }
}

答案 4 :(得分:0)

试试这个:

    private void newGameToolStripMenuItem_Click(object sender, EventArgs e)
    {
        labels.Clear();
        Control[] matches;
        for (int i = 1; i <= 16; i++)
        {
            matches = this.Controls.Find("label" + i.ToString(), true);
            if (matches.Length > 0 && matches[0] is Label)
            {
                Label lbl = (Label)matches[0];
                labels.Add(lbl);
                lbl.Enabled = true;
                if (lbl.Visible == false)
                {
                    lbl.Visible = true;
                }

            }
        }
    }