【问题标题】:Linq Code with Distinct or GroupBy not working具有 Distinct 或 GroupBy 的 Linq 代码不起作用
【发布时间】: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 是否相等。
  • 什么是“策略”。我假设这是你项目中的一个类?你在课堂上覆盖了EqualsGetHashCode 吗?
  • SelectListItemIComparable 没有按预期工作,因为它依赖于默认实现(并且您只想比较两个属性)。你应该稍微改变你的代码,不要做.Select(group =&gt; new SelectListItem),而是使用其他类型并做.Select(group =&gt; group.First().Group).Distinct().ToList()
  • 简单来说。你应该list --&gt; data --&gt; distinct --&gt; List&lt;SelectListItem

标签: c# list linq drop-down-menu unique


【解决方案1】:

可能SelectListItem 使用引用相等。因此Distinct 不起作用。将Distinct 应用于组值本身

List<SelectListItem> groupListItems = list
    .Select(w => w.Group)
    .Where(g => g != null)
    .Distinct()
    .Select(g => new SelectListItem { Value = g, Text = g })
    .ToList();

另一种解决方法是在SelectListItem 中覆盖EqualsGetHashCode

在您的第二个代码 sn-p 中,您不是按组分组,而是按比较产生的布尔值 w.Group != null

.GroupBy(w => w.Group != null)

因此,如果它们都不为空,那么您只会得到一组 Key = true

【讨论】:

  • 非常感谢!这正是它应有的方式。
【解决方案2】:

使用 FirstOrDefault() 只获取第一个元素

ViewBag.Groupddl = new SelectList(groupListItems, "Value", "Text").FirstOrDefault();

【讨论】:

  • 这如何回答 OP 问题?他想要不同的价值观,而不是第一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多