如何用LINQ批量设置SelectListItem的Selected属性为true
解决方案
你原来的代码存在两个关键问题:
- 使用
Where会过滤掉未选中的选项,但下拉列表通常需要保留所有可选项,仅标记匹配项为选中状态 - 将ID列表直接
ToString()后调用Contains是错误逻辑(得到的是集合类型的字符串表示,无法正确匹配选项ID)
正确的实现思路是:先提取需要选中的ID集合,再通过LINQ的Select方法遍历所有选项,为匹配项设置Selected属性,无需循环即可完成:
// 先缓存选中的ID集合,转成HashSet提升查询效率 var selectedIds = new HashSet<string>( _availabilityFormatMap.GetAvalabilityStorageFormat(id) .Select(y => y.ID.ToString()) ); // 遍历所有选项,设置Selected属性 StorageFormats = (await _storageFormat.GetStorageFormatSelectList()) .Select(item => new SelectListItem { Value = item.Value, Text = item.Text, Selected = selectedIds.Contains(item.Value) }) .ToList();
如果你的ID是数值类型(如int),注意要和SelectListItem.Value的字符串类型保持一致,所以需要把ID转为字符串再存入集合。
如果追求极致紧凑,也可以把集合初始化嵌入LINQ中,但会多次调用GetAvalabilityStorageFormat(id),性能不如缓存集合的写法:
StorageFormats = (await _storageFormat.GetStorageFormatSelectList()) .Select(item => new SelectListItem { Value = item.Value, Text = item.Text, Selected = _availabilityFormatMap.GetAvalabilityStorageFormat(id) .Select(y => y.ID.ToString()) .Contains(item.Value) }) .ToList();
内容的提问来源于stack exchange,提问作者beeeeeeeeeen
相关产品推荐
相关产品推荐

