Как добавить определенное количество меток в массив меток?

#c# #arrays #foreach #label

#c# #массивы #foreach #метка

Вопрос:

Я пытался добавить несколько свечей в массив, чтобы я мог использовать этот массив для остальной части моего кода, проще используя свойства свечей. Однако, похоже, мой код неверен, и я бы хотел, чтобы кто-нибудь помог мне с этим. (Color != DarkGoldenrod отличает свечи от других меток в моем проекте, все из которых имеют одинаковый цвет)

 private Label[] CandlesToMatrix()
    {
        Label[] candles = new Label[7];
        foreach (Control ctrl in this.Controls)
        {
            if ((ctrl is Label) amp;amp; (ctrl.BackColor != Color.DarkGoldenrod))
            {
                for (int i = 0; i < 7; i  )
                {
                    candles[i] = (Label)ctrl;
                }
            }
        }
        return candles;

    }
 

Комментарии:

1. Пожалуйста, объясните пошагово (псевдокод), чего вы хотели бы достичь

2. @Simon Я хотел бы вставить 7 определенных меток в массив меток (поиск по ним выполняется автоматически)

3. вы заполняете весь массив последним элементом управления, который соответствует критериям. Для этого не следует использовать цикл for . И почему число 7?

4. В вашем коде candles[i] = (Label) ctrl создает 7 одинаковых меток в candles

5. Я думаю, вам нужны свечи [i] = (Label)ctrl[i];

Ответ №1:

Проблема, с которой вы сталкиваетесь, заключается в том, что вы назначаете каждому элементу в массиве элемент управления, соответствующий критериям.

Код выполняется следующим образом: перечислите все элементы управления и проверьте, является ли это меткой, а не каким-то определенным цветом. Если он найдет одну, он заполнит весь массив ссылкой на этот элемент управления. Если массив уже был заполнен предыдущим совпадением, он будет перезаписан.

Таким образом, вы получаете массив, заполненный либо нулем, либо последним соответствующим элементом управления.

Я думаю, вы хотели бы, чтобы массив был заполнен «уникальными» элементами управления. Поэтому каждый раз, когда вы находите совпадение, вам нужно увеличивать индекс, чтобы записать его.

Например:

 private Label[] CandlesToMatrix()
{
    Label[] candles = new Label[7];

    // declare a variable to keep hold of the index
    int currentIndex = 0;

    foreach (Control ctrl in this.Controls)
    {
        if ((ctrl is Label label) amp;amp; (label.BackColor != Color.DarkGoldenrod))
        {
            // check if the currentIndex is within the array. Never read/write outside the array.
            if(currentIndex == candles.Length)
                break;
                
            candles[currentIndex] = label;
            currentIndex  ;
        }
    }
}
 

Я добавлю еще один пример……

C # может предложить гораздо больше. Это немного старый стиль программирования на си. Массивы фиксированного размера и т.д. В C # у вас также есть список, в котором используется тип, который вы используете между < и > . Например. List<Label> .

Вот пример, в котором используется список.

 private Label[] CandlesToMatrix()
{
    List<Label> candles = new List<Label>();
    
    // int currentIndex = 0;   You don't need to keep track of the index. Just add it.
    foreach (Control ctrl in this.Controls)
    {
        if ((ctrl is Label label) amp;amp; (label.BackColor != Color.DarkGoldenrod))
        {
            candles.Add(label);
        }
    }
    
    return candles.ToArray(); // if you still want the array as result.
}
 

и… вы также можете использовать Linq (что является следующим шагом)

 private Label[] CandlesToMatrix()
{
    return this.Controls
        // check the type.
        .OfType<Label>()
        // matches it the creteria?
        .Where(label => ((ctrl is Label label) amp;amp; (label.BackColor != Color.DarkGoldenrod))
        // fillup an array with the results
        .ToArray();
}
 

Комментарии:

1. Спасибо, это работает, теперь у меня возникла другая проблема с другим местом в коде, но эта часть была решена, так что спасибо!