C# 具有Distinct或GroupBy的Linq代码不工作

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

我试图填充一个列表,这样我就可以把它放在一个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();
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问题的?他想要的是不同的价值观,而不是第一个价值观这是如何回答问题的?他想要不同的价值观,而不是第一个。非常感谢你!这就是它的工作原理。非常感谢!这就是它的工作原理。