Могу ли я использовать linq для удаления элементов из asp .net DropDownList.Items?

Как видно из заголовка, возможно ли использовать LINQ для удаления элементов из элементов DropDownList. Элементы, в которых элемент не равен указанным мной строкам?

Иными словами, у меня есть список строк, если элемент не соответствует ни одной строке в списке, он удаляется.

ПРИМЕЧАНИЕ: я знаю, как этого добиться, я могу сделать это с помощью цикла foreach. Это хорошо, но я хочу знать, есть ли альтернатива LINQ.

РЕДАКТИРОВАТЬ: я должен сказать - свойство элемента .Text соответствует любому элементу в списке строк.

РЕДАКТИРОВАТЬ: Для тех, кто заинтересован, это был мой предложенный способ "foreach":

        private void FilterDropDownChoices(List<String> permittedChoices)
        {
            foreach(ListItem item in ddlChoices.Items)
            {
                if (!permittedChoices.Contains(item.Text))
                {
                    ddlChoices.Items.Remove(item);
                }
            }
        }

3 ответа

Решение

На самом деле рианулит предоставил лучший ответ.

Проблема в том, что ListItemCollection реализует только интерфейс IEnumerable. Расширения LINQ работают на IEnumerable. Следовательно, приведение (IEnumerable) к (IEnumerable) - теперь вы можете использовать LINQ.

Итак, чтобы ответить на ваш вопрос:

ddlChoices.Items
.Cast<ListItem>()
.Where(item => !permittedChoices.Contains(item.Text))
.ToList()
.ForEach(ddlChoices.Items.Remove);

Вы должны использовать ToList() или ToArray() или аналогичные, потому что вы не можете изменять коллекцию во время чтения из нее - ToList() копирует ссылки на выбранные элементы, которые затем могут быть зациклены и удалены из ListItemCollection.

При написании этого я видел комментарий Мэттена - он выделил полезную функциональность ListItemCollection (возможность удалять элементы по их текстовому свойству), но неправильно понял вопрос. Требование было: вам разрешено иметь только "allowChoices" внутри ddlChoices.Items. Пример Мэттена удаляет допустимые варианты и оставляет неправильные, что противоположно тому, что он просил.

LINQ - это язык запросов, он не используется для изменения ваших данных. что вы можете сделать, это запросить ваш список элементов для условия, которое вам нравится, и затем повлиять на сбор самостоятельно.

образец:

var relevant = from item in list.Items
               where permittedChoices.Contains(item.ToString())
               select item

и затем вы можете очистить список товаров и добавить только то, что вам нужно.

ddlChoices.Clear();
ddlChoices.AddRange(relevant.ToArray());

Просто использовать linq? Ну вот:-)

private static void FilterDropDownChoices(List<String> permittedChoices)
{
    ddlChoices.Items.Cast<ListItem>()
       .Where(li => permittedChoices.Contains(li.Text))
       .ToList()
       .ForEach(ddlChoices.Items.Remove);
}
Другие вопросы по тегам