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

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

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

    }

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

Simon Sultana 13.12.2020 21:24

@Simon Я хотел бы вставить 7 конкретных меток в массив меток (ищите их автоматически)

FogelF7 13.12.2020 21:27

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

Jeroen van Langen 13.12.2020 21:31

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

Simon Sultana 13.12.2020 21:32

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

Simon Sultana 13.12.2020 21:32

Как это исправить? я новичок в foreach

FogelF7 13.12.2020 21:33

попробуйте заменить Candles[i] = (Label)ctrl на Candles[i] = ctrl[i];

Simon Sultana 13.12.2020 21:35

@Simon говорит: «Невозможно применить индексирование с помощью [] к выражению типа« Элемент управления »»

FogelF7 13.12.2020 21:37

Как сделать ctrl ярлыком?

FogelF7 13.12.2020 21:38

свечи[i] = (Ярлык)ctrl[i];

Simon Sultana 13.12.2020 21:39

Добавьте код назначения ctrl, это вообще массив?

Simon Sultana 13.12.2020 21:42

Свечи @Simon — это массив, ctrl — это метка, которую нужно постоянно менять, чтобы попасть в массив

FogelF7 13.12.2020 21:43

@JeroenvanLangen Как мне прокручивать массив, заменяя каждое место меткой без цикла for?

FogelF7 13.12.2020 21:45

@ FogelF7 Я только что написал ответ на это.

Jeroen van Langen 13.12.2020 21:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
14
257
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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) && (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) && (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) && (label.BackColor != Color.DarkGoldenrod))
        // fillup an array with the results
        .ToArray();
}

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

FogelF7 13.12.2020 21:54

Другие вопросы по теме