Как удалить дубликат элемента по значению свойства в списке

#c# #linq

#c# #linq

Вопрос:

Может ли кто-нибудь помочь мне выполнить этот запрос Linq и показать мне, как извлечь разные названия продуктов

 List<StatePlan> planTypes = (from ppt in context.PlanPlanTypes
     join pt in context.PlanTypes on ppt.PlanTypeRowID equals pt.PlanTypeRowID
     join ppts in context.PlanPlanTypeStates on ppt.PlanPlanTypeRowID equals ppts.PlanPlanTypeRowID
     join p in context.Plans on ppt.PlanRowID equals p.PlanRowID
     where ppts.StateCode == stateCode
     where p.IsActive == true
     select new StatePlan
     {   
         PlanID = p.PlanRowID,
         StateCode = stateCode,
         Name = p.Name,
         Description = p.Description,
         Disclaimer = p.Disclaimer,
         Sequence = p.DisplaySequence,
         //Rates = GetRates(p.PlanRowID),
         //Types = GetPlanTypes(p.PlanRowID, stateCode)
     }).ToList();
return planTypes;
  

Ответ №1:

Я не уверен, правильно ли я понял вопрос, но если вам нужны элементы с определенным отдельным полем, вы можете сначала использовать groupby :

 seq.GroupBy(item=>item.Name).Select(group=>group.First())
  

Вы также могли бы использовать средство сравнения равенства проекций, но я считаю это немного некрасивым. Для меня использование Distinct подразумевает, что вам все равно, какой из эквивалентных элементов вы получите. В то время как groupby first явно указывает, что вам нужен первый элемент.

GroupBy также позволяет вам собирать дополнительную информацию в вашем Select предложении, например, сколько элементов с таким именем существует.


Если вам нужны только разные имена без связанного элемента, объедините select и distinct:

 seq.Select(item=>item.Name).Distinct()
  

Ответ №2:

Сначала сгруппируйте его, затем возьмите первый

 List<StatePlan> planTypes = (from ppt in context.PlanPlanTypes
                                             join pt in context.PlanTypes on ppt.PlanTypeRowID equals pt.PlanTypeRowID
                                             join ppts in context.PlanPlanTypeStates on ppt.PlanPlanTypeRowID equals ppts.PlanPlanTypeRowID
                                             join p in context.Plans on ppt.PlanRowID equals p.PlanRowID
                                             where ppts.StateCode == stateCode
                                             where p.IsActive == true
                                             select new StatePlan
                                             {   
                                                 PlanID = p.PlanRowID,
                                                 StateCode = stateCode,
                                                 Name = p.Name,
                                                 Description = p.Description,
                                                 Disclaimer = p.Disclaimer,
                                                 Sequence = p.DisplaySequence,
                                                 //Rates = GetRates(p.PlanRowID),
                                                 //Types = GetPlanTypes(p.PlanRowID, stateCode)
                                             })
                                             .GroupBy(g => g.Name)
                                             .Select(s => s.First())
                                             .ToList();
            return planTypes;
  

Комментарии:

1. Это отлично сработало, однако мне нужно было изменить на s.FirstOrDefault()

2. @JonHarding Зачем тебе это изменение? Я бы ожидал, что в каждой группе будет хотя бы один элемент.

3. Была выдана ошибка: «Метод ‘First’ может использоваться только в качестве заключительной операции запроса. Вместо этого рассмотрите возможность использования метода ‘FirstOrDefault’ в этом экземпляре.» Я попробовал это предложение, и оно сработало.

Ответ №3:

 planTypes.Select(pt=>pt.Name).Distinct();
  

Ответ №4:

Вы можете вызвать Distinct и предоставить IEqualityComparer для StatePlan

Distinct

Ответ №5:

Предполагая, что название продукта является Name свойством в planTypes списке и что это строка:

 List<string> productNames = planTypes.Select(t => t.Name).Distinct().ToList();