Я пытался добавить несколько свечей в массив, чтобы я мог использовать этот массив для остальной части моего кода, более легко используя свойства свечей. Однако мой код не кажется правильным, и я бы хотел, чтобы кто-нибудь помог мне в этом. (Цвет != 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 Я хотел бы вставить 7 конкретных меток в массив меток (ищите их автоматически)
вы заполняете весь массив последним элементом управления, который соответствует критериям. Вы не должны использовать цикл for для этого. А почему цифра 7?
В вашем коде Candles[i] = (Label)ctrl создает 7 одинаковых меток в свечах
Думаю, вам нужны свечи[i] = (Label)ctrl[i];
Как это исправить? я новичок в foreach
попробуйте заменить Candles[i] = (Label)ctrl на Candles[i] = ctrl[i];
@Simon говорит: «Невозможно применить индексирование с помощью [] к выражению типа« Элемент управления »»
Как сделать ctrl ярлыком?
свечи[i] = (Ярлык)ctrl[i];
Добавьте код назначения ctrl, это вообще массив?
Свечи @Simon — это массив, ctrl — это метка, которую нужно постоянно менять, чтобы попасть в массив
@JeroenvanLangen Как мне прокручивать массив, заменяя каждое место меткой без цикла for?
@ FogelF7 Я только что написал ответ на это.
Проблема, с которой вы сталкиваетесь, заключается в том, что вы назначаете каждому элементу массива элемент управления, соответствующий критериям.
Код работает так: перечислить все элементы управления и проверить, является ли это меткой, а не каким-то определенным цветом. Если он его найдет, то заполнит весь массив ссылкой на этот элемент управления. Если массив уже был заполнен предыдущим совпадением, он будет перезаписан.
Таким образом, вы получаете массив, заполненный либо нулевым значением, либо последним совпадающим элементом управления.
Я думаю, вы хотели бы, чтобы массив был заполнен «уникальными» элементами управления. Поэтому каждый раз, когда вы находите совпадение, вам нужно увеличивать индекс, чтобы записать его.
Например:
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();
}
Спасибо, это работает, у меня сейчас другая проблема с другим кодом, но эта часть была решена, так что спасибо!
Пожалуйста, объясните по шагам (псевдокод), чего вы хотите достичь