Код Linq с Distinct или GroupBy не работает - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь заполнить список, чтобы я мог поместить его в 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();

Как получить его, чтобы раскрывающийся список заполнял только все уникальныезначения без повторения?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Используйте FirstOrDefault (), чтобы получить только первый элемент

ViewBag.Groupddl = new SelectList(groupListItems, "Value", "Text").FirstOrDefault();
0 голосов
/ 03 октября 2018

Вероятно 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();

Другая возможность исправить это - переопределить Equals и GetHashCode в SelectListItem.

во втором фрагменте кодаВы группируете не по группе, а по логическому значению, полученному в результате сравнения w.Group != null.

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

Итак, если все они не равны нулю, вы получите только одну группу с ключом = true. * * 1017

...