Можно ли использовать substring с OfType?

#c# #arrays #textbox #substring #checklistbox

#c# #массивы #текстовое поле #substring #контрольный список

Вопрос:

Я нахожусь в школьном проекте, и мне было интересно, как отобразить в многострочном текстовом поле — не в ListBox, это было частью вопроса — как отобразить первые пять букв отмеченных элементов CheckedListBox. Мы не можем показать их напрямую, мы должны создать массив, который будет сохранен в пользовательском классе с помощью конструктора. Моей первой мыслью было использовать событие SelectedIndexChanged контрольного списка и использовать увеличенные, .Items и .substring, чтобы поместить выбранную подстроку в массив. Вот мой первый код:

 private void checkedListBox_programmes_SelectedIndexChanged(object sender, EventArgs e)
    {
        int selection = checkedListBox_programmes.SelectedIndex;

        if (selection != -1)
        {
            if (indice < 5)
            {
                tabProgrammes[indice] = checkedListBox_programmes.Items[selection].ToString().Substring(0, 6);
                indice  ;
            }
            else
            {
                MessageBox.Show("Tableau de données est rempli");
            }
        }
    }
}
  

* tabProgrammes и indice инициализируются в моем частичном классе

Это не сработало, потому что снятие флажка index добавило бы строку в мой массив. Итак, второй код (я использую событие buton_click):

 // remplissage du tableau avec les éléments sélectionnées
tabProgrammes = checkedListBox_programmes.CheckedItems.OfType<string>().ToArray();

// création du profile
Profil unProfil = new Profil(textBox_Prenom.Text, textBox_Nom.Text, textBox_Utilisateur.Text, dateTimePicker_Naissance.Value, tabProgrammes);

// affichage des donnees
textBox_Affichaqe.Text = unProfil.ToString();
  

Это работает очень хорошо, потому что я могу проверять и снимать флажок без проблем. ИТАК, моя проблема в том, что мне нужно поместить в мой массив только подстроку (0,6) моих отмеченных элементов.
Идея?

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

1. Вы имеете в виду это? checkedListBox_programmes.CheckedItems.OfType<string>().Select(x => x.Length > 6 ? x.Substring(0, 6) : x).ToArray();

2. Пожалуйста, уточните

3. Да, загадочность, это то, что я искал. Спасибо!

Ответ №1:

Да, вы можете использовать Substring() в результате OfType<string>() .

Для этого вам необходимо использовать оператор Select() Linq в вашем конкретном случае.

Вот пример:

 static void Main(string[] args)
{
    var dataSource = new object[]
    {
        42,
        "bonjour",
        "allo",
        1000,
        "salut"
    };

    var myStrings = dataSource
        .OfType<string>()
        // In this case, we use substring only if the length of the string is above 6.
        .Select(s => s.Length > 6 ? s.Substring(0, 6) : s)
        .ToArray();

    foreach (var item in myStrings)
    {
        Debug.WriteLine(item);
    }
}
  

Он выводит следующее:

 bonjou
allo
salut
  

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

1. Спасибо, это работает действительно хорошо. Можете ли вы объяснить мне => и the ?

2. => используется для лямбда-выражений , а ? : является условным оператором , if/else эквивалентным an и.

3. Утверждение «Да, вы можете использовать Substring() для результата OfType<string>() » не совсем корректно. Они не связаны напрямую. Вы используете, OfType<string>() чтобы убедиться, что у вас есть IEnumerable<string> , на котором вы можете использовать Select<string>(x => ...) . Затем вы можете использовать Substring(...) на x в .Select .