【发布时间】:2018-10-03 14:24:58
【问题描述】:
我正在尝试填充一个列表,以便将其放入 ViewBag 和 DropDownList。我想要它,以便下拉列表仅显示唯一值。 我尝试了两种方法。一个是没有工作的独特之处。这显示了所有结果并重复了它们。下面我将插入代码。
List<Strategy> list = new List<Strategy>();
List<SelectListItem> groupListItems = list
.Where(w => w.Group != null)
.Select(group => new SelectListItem { Value = group.Group, Text = group.Group })
.Distinct()
.ToList();
ViewBag.Groupddl = new SelectList(groupListItems, "Value", "Text")
.Distinct();
然后我正在阅读一些帖子,人们建议我尝试使用 GroupBy 方法。这导致只有一个项目(第一个)填充下拉列表,即使应该有更多的唯一值。
List<Strategy> list = new List<Strategy>();
List<SelectListItem> groupListItems = list
.GroupBy(w => w.Group != null)
.Select(group => new SelectListItem {
Value = group.First().Group,
Text = group.First().Group })
.ToList();
ViewBag.Groupddl = new SelectList(groupListItems, "Value", "Text")
.Distinct();
如何让下拉列表只填充所有唯一值而不重复?
【问题讨论】:
-
Distinct 将使用类 Equals 方法来检查两个项目是否相等。默认是检查引用是否相同,这不适用于您的情况。您可以覆盖 SelectListItem 类的 Equals 和 GetHash 方法来检查 Value 和 Text 是否相等。
-
什么是“策略”。我假设这是你项目中的一个类?你在课堂上覆盖了
Equals和GetHashCode吗? -
SelectListItem的IComparable没有按预期工作,因为它依赖于默认实现(并且您只想比较两个属性)。你应该稍微改变你的代码,不要做.Select(group => new SelectListItem),而是使用其他类型并做.Select(group => group.First().Group).Distinct().ToList() -
简单来说。你应该
list --> data --> distinct --> List<SelectListItem
标签: c# list linq drop-down-menu unique