Могу ли я использовать 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
Итак, чтобы ответить на ваш вопрос:
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);
}