Исключить последний столбец DataGridView из выбора

Я пытаюсь получить список всех имен столбцов DataGridView кроме последнего.

Следующее возвращает все столбцы:

var columnsList = datagridview.Columns
            .Cast<DataGridViewColumn>()
            .Select(c => c.Name);

Я пытался использовать Except чтобы удалить последний столбец для возвращаемого значения:

 var columnsList = datagridview.Columns
            .Cast<DataGridViewColumn>()
            .Select(c => c.Name)
            .Except((datagridview.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.Visible).Name));

Я получаю сообщение об ошибке IEnumerable<string> не содержит определения для Except,

Как этого добиться?

3 ответа

Решение

Вы можете исключить последний столбец, взяв только n-1 столбцы:

var columnsList = datagridview.Columns
                              .Cast<DataGridViewColumn>()
                              .Take(datagridview.Columns.Count-1)
                              .Select(c => c.Name);

Получить список всех имен столбцов DataGridView, кроме последнего = взять первым datagridview.Columns.Count - 1 столбцы

поскольку Columns имеет индексатор и реализует только IEnumerable (не универсальный) я бы использовал Enumerable.Range Вот

var names = Enumerable.Range(0, datagridview.Columns.Count - 1)
                      .Select(idx => datagridview.Columns[idx].Name);

Except требует коллекции в качестве входного аргумента. Это заданная операция: set1 минус set2. Так что технически это должно быть

var lastColumn = datagridview.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.Visible).Name;
var columnsList = datagridview.Columns
            .Cast<DataGridViewColumn>()
            .Select(c => c.Name)
            .Except(new[] { lastColumn });

Но, конечно, как уже ответили, это гораздо проще в использовании Take(n-1), где n это количество столбцов.

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