C# 具有Distinct或GroupBy的Linq代码不工作
我试图填充一个列表,这样我就可以把它放在一个ViewBag和一个DropDownList中。我想要它,这样下拉列表将只显示唯一的值。 我尝试了两种方法。一个是不起作用的明显的。这显示了所有结果并重复了它们。下面我将插入代码C# 具有Distinct或GroupBy的Linq代码不工作,c#,list,linq,drop-down-menu,unique,C#,List,Linq,Drop Down Menu,Unique,我试图填充一个列表,这样我就可以把它放在一个ViewBag和一个DropDownList中。我想要它,这样下拉列表将只显示唯一的值。 我尝试了两种方法。一个是不起作用的明显的。这显示了所有结果并重复了它们。下面我将插入代码 List<Strategy> list = new List<Strategy>(); List<SelectListItem> groupListItems = list .Where(w => w.Group != nu
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();
List List=新列表();
List groupListItems=列表
.Where(w=>w.Group!=null)
.Select(group=>newselectListItem{Value=group.group,Text=group.group})
.Distinct()
.ToList();
ViewBag.Groupddl=新建选择列表(groupListItems,“值”、“文本”)
.Distinct();
然后我读了一些帖子,人们建议我尝试使用GroupBy方法。这导致只有一个项目(第一个)填充dropdownlist,即使应该有更多的唯一值
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();
List List=新列表();
List groupListItems=列表
.GroupBy(w=>w.Group!=null)
.选择(组=>new SelectListItem{
Value=group.First().group,
Text=group.First().group})
.ToList();
ViewBag.Groupddl=新建选择列表(groupListItems,“值”、“文本”)
.Distinct();
如何获得它,使下拉列表只填充所有唯一值而不重复?可能
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();
因此,如果它们都不是空的,那么只会得到一个组,其键=
true
可能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();
因此,如果它们都不为null,则只会得到一个组,其键=true
使用FirstOrDefault()仅获取第一个元素
ViewBag.Groupddl = new SelectList(groupListItems, "Value", "Text").FirstOrDefault();
使用FirstOrDefault()仅获取第一个元素
ViewBag.Groupddl = new SelectList(groupListItems, "Value", "Text").FirstOrDefault();
Distinct将使用class Equals方法检查两项是否相等。默认设置为检查引用是否相同,这不适用于您的案例。您可以重写SelectListItem类的Equals和GetHash方法来检查值和文本是否相等。什么是“策略”。我想这是你项目中的一个类?您是否在类中重写了
Equals
和GetHashCode
?由于依赖于默认实现(并且您只希望比较两个属性),SelectListItem的IComparable
未按预期工作。您应该稍微更改代码,不要执行.Select(group=>new SelectListItem)
,而是使用其他类型并执行.Select(group=>group.First().group).Distinct().ToList()
,简单地说。您应该list-->数据-->distinct-->listdinct将使用class Equals方法检查两项是否相等。默认设置为检查引用是否相同,这不适用于您的案例。您可以重写SelectListItem类的Equals和GetHash方法来检查值和文本是否相等。什么是“策略”。我想这是你项目中的一个类?您是否在类中重写了Equals
和GetHashCode
?由于依赖于默认实现(并且您只希望比较两个属性),SelectListItem的IComparable
未按预期工作。您应该稍微更改代码,不要执行.Select(group=>new SelectListItem)
,而是使用其他类型并执行.Select(group=>group.First().group).Distinct().ToList()
,简单地说。您应该列出-->数据-->不同-->列表这是如何回答OP问题的?他想要的是不同的价值观,而不是第一个价值观这是如何回答问题的?他想要不同的价值观,而不是第一个。非常感谢你!这就是它的工作原理。非常感谢!这就是它的工作原理。