Как сгруппировать linq по нескольким столбцам в c#

#linq

#linq

Вопрос:

У меня есть список, как показано ниже:

 Health_Plan  HealthMemberType_Name   Health_Benefit_Description     

Silver       Parent                  a1     
Silver       Spouse                  b1     
Silver       Children                c1     
Silver       Parent                  a2         
Silver       Spouse                  b2    
Silver       Children                c2    
Gold         Parent                  a1    
Gold         Spouse                  b1
Gold         Children                c1
Gold         Parent                  a2
Gold         Spouse                  b2
Gold         Children                c2
  

Я ожидаю получить следующий результат (группировать по Health_Plan и HealthMemberType_Name)

 Silver 
   Parent 
       a1     
       a2 
   Spouse 
       b1
       b2

   Children
       c1
       c2

Gold     
   Parent
       a1
       a2

   Spouse            
       b1
       b2

   Children            
       c1
       c2
  

попробованные коды ниже:

 var _aBenefits = _lHealthBenefit.GroupBy(o1 => new { o1.Health_Plan_Pid, o1.Health_Plan }).Select(grp1 => new Health_Benefits_Consolidated
                                    {
                                        Health_Plan_Pid = grp1.Key.Health_Plan_Pid,
                                        Health_Plan = grp1.Key.Health_Plan,
                                        Health_Benefits = grp1.ToList()
                                    }).ToList();

     public class Health_Benefits
    {
        public long Health_Plan_Pid { get; set; }
        public string Health_Plan { get; set; }
        public string Health_Benefit_Description { get; set; }
        public double Health_MaxLimit { get; set; }
        public string HealthMemberType_Name { get; set; }
        public string CCY { get; set; }
        public int Max_Member { get; set; }
    }

    public class Health_Benefits_Consolidated
    {
        public long Health_Plan_Pid { get; set; }
        public string Health_Plan { get; set; }
        public int Max_Member { get; set; }
        public List<Health_Benefits> Health_Benefits { get; set; }
    }
  

похоже, мне нужно сгруппировать «HealthMemberType_Name» в список.. но я не знаю, как вставить group в «Health_Benefits = grp1.ToList()»

приветствуется любая помощь..

заранее большое спасибо

С уважением, Дон

Ответ №1:

Итак, вы хотите сгруппировать свои входные элементы в группы входных элементов, которые имеют одинаковые HealthPlan .

Элементы каждой группы должны быть сгруппированы в подгруппы, где каждый элемент подгруппы имеет HealthMemberTypeName .

Элементы каждой подгруппы являются HealthBenefitDescriptions этого Group - SubGroup

Для этого мы используем GroupBy внутри другого GroupBy. Мы используем перечислимые.Перегрузка GroupBy, которая имеет resultSelector

 var results = myInputSequence.GroupBy(

    // parameter KeySelector: make groups of inputItems that have equal HealthPlan
    inputItem => inputItem.HealthPlan,

    // parameter resultSelector: take the common HealthPlan, and all input items
    // that have this Healthplan to make a new object:
    (healthPlan, inputItemsWithThisHealthPlan) => new
    {
        HealthPlan = healthPlan,

        // Subgroups: take all input items with this healthplan, and group by
        // HealthMemberTypeName
        HealthMembers = inputItemsWithThisHealthPlan.GroupBy(

            // keySelector:
            inputItemWithThisHealthPlan => inputItemWithThisHealthPlan.HealthMemberTypeName,

            // ResultSelector: take the common HealthMemberTypeName and all
            // input items with this HealthPlan and this HealthMemberTypeName
            // to make one new object
            (healthMemberTypeName, inputItemsWithThisHealthMemberTypeName) => new
            {
                HealthMemberTypeName = healthMemberTypeName,

                // keep only the HealthBenefitDescriptions:
                HealthBenefitDescriptions = inputItemsWithThisHealthMemberTypeName
                   .Select(inputItemWithThisHealthMemberTypeName => inputItemsWithThisHealthMemberTypeName.HealthBenefitDescription)
                   .ToList(),
            })
            .ToList(),
       });
  

Длинные имена идентификаторов могут затруднить чтение, но я подумал, что это поможет вам лучше понять, что в нем содержится, чем если бы я использовал x, y, z . Множественное число — это последовательности, единичные числа — элементы этих последовательностей

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

1. Привет .. в моем случае я думал, что нужно только сгруппировать Health_Benefits = grp1. ToList() .. как сгруппировать его внутри следующего: var _aBenefits = _lHealthBenefit. GroupBy(o1 => new { o1.Health_Plan_Pid, o1.Health_Plan }). Выберите (grp1 => new Health_Benefits_Consolidated { Health_Plan_Pid = grp1.Key.Health_Plan_Pid, Health_Plan = grp1.Key.Health_Plan, Health_Benefits = grp1. ToList() }). ToList();