繁体   English   中英

将表行解析为嵌套集合

[英]Parsing table rows into nested collections

我有一个如下数据表。 我正在尝试使用C#使用清单2中的嵌套集合类结构对它们进行分组,以便结果类似于列表3.每个级别上的每个集合都不应具有重复值。 有谁知道如何解析表格? 谢谢。

清单1:

    user_ID firstName Role                      service                     facility        RWP      Fac_ID     svc_ID   rol_ID
    ------- --------- -----------------------   --------------------------- --------------  -----
    874     Joe       Tech                      Primary                     New York, NY    9-2       1          1        1 
    874     Joe       Reviewer                  Primary                     New York, NY    2-5       1          1        2
    874     Joe       Reviewer                  Primary                     Los Angeles, CA 2-5       2          1        2
    874     Joe       Super User                Primary                     Los Angeles, CA 9-10      2          1        3
    874     Joe       Administrator             Application Administration  Los Angeles, CA 1-2       2          2        4 
    874     Joe       Super User                Application Administration  Chicago, IL     10-12     3          2        3 

清单2:

Facility {
    fac Facility; 
    List<Service> Services;
}
Service{
    svc Service;
    List<Role> Roles;
}
Role{
    rol Role;
    List<RWP> RWP;
}
RWP{
    string H;
}
fac{
    int fac_ID;
    string fac_Name;
}
svc{
    int svc_ID;
    string svc_Name;
}
rol{
    int rol_ID;
    string rol_Name;
}

清单3:

                 NY
                 |  
          +-- Primary --+   
          |             |
       Tech             Reviewer
       |                       |
       9-2                     2-5

       +------- LA --------------------+
       |                               |
    Application                 +----Primary----+   
    Administration              |               |
       |                        |               |
   Administrator              Reviewer      Super User
       |                        |               |
      1-2                      2-5             9-10

              CH
              |
        Application 
        Administration
              |
         Super User
              |
            10-12

清单4:

private static void populateUserFSR(ref User thisUser, DataTable dt, string FSRtype)
{
    string tmpFacility = string.Empty;
    string tmpService = string.Empty;
    string tmpRole = string.Empty;
    FSR thisFSR = new FSR();
    thisFSR.serviceRoles = new List<SR>();

    SR thisSR = new SR();
    thisSR.service = new List<Service>();
    thisSR.rolesWatchProviders = new List<RP>();

    RP thisRWP = new RP();
    thisRWP.providers = new List<string>();

    foreach (DataRow r in dt.Rows)
    {
        if (r["facility_ID"].ToString().Trim().ToUpper() != tmpFacility)
        {
            //new facility row
            if (!string.IsNullOrEmpty(tmpFacility))
            {
                //add to a proper collection according to their FSRtype
                switch (FSRtype)
                {
                    case "Assigned":
                        thisUser.FSRAssigned.Add(thisFSR);
                        break;
                    case "Preferred":
                        thisUser.FSRPreferred.Add(thisFSR);
                        break;
                    case "Selected":
                        thisUser.FSRSelected.Add(thisFSR);
                        break;
                }
                thisFSR = new FSR();
                thisFSR.serviceRoles = new List<SR>();

                thisSR = new SR();
                thisSR.service = new List<Service>();
                thisSR.rolesWatchProviders = new List<RP>();

                thisRWP = new RP();
                thisRWP.providers = new List<string>();
            }
            tmpFacility = r["facility_ID"].ToString();
            tmpService = string.Empty;
            tmpRole = string.Empty;
            thisFSR.facility = new Facility();
            thisFSR.facility.Facility_ID = int.Parse(r["facility_ID"].ToString());
            thisFSR.facility.Facility_Name = r["facility_name"].ToString();

            //only rank with FSR Assigned, no ranking with FSR Preferred
            if (FSRtype == "Assigned")
                thisFSR.rank = int.Parse(r["rank"].ToString());
        }

        if (r["Service_ID"].ToString().Trim().ToUpper() != tmpService)
        {
            tmpService = r["Service_ID"].ToString();
            tmpRole = string.Empty;
            Service thisService = new Service();
            thisService.ServiceID = int.Parse(r["Service_ID"].ToString());
            thisService.ServiceName = r["fac_service"].ToString();
            thisSR.service = new List<Service>();
            thisSR.service.Add(thisService);
            thisFSR.serviceRoles.Add(thisSR);
        }

        if (r["Role"].ToString().Trim().ToUpper() != tmpRole)
        {
            tmpRole = r["Role"].ToString();
            thisRWP.role = new Role();
            thisRWP.role.Id = int.Parse(r["role_ID"].ToString());
            thisRWP.role.Role = r["Role"].ToString();
            thisRWP.providers = getCohortPCP(thisUser);
            thisSR.rolesWatchProviders.Add(thisRWP);
        }
    }
}

试试这个:

var list3 = list1.AsEnumerable()
                 .GroupBy(x=>x.Field<string>("facility"))
                 .Select(g=> new Facility{ Facility=g.Key,       
                             Services = g.GroupBy(x=>x.Field<string>("Role"))
                                         .Select(g1=> new Service{
                                                    Service = g1.Key,
                                                    Roles = g1.GroupBy(x=>x.Field<string>("RWP"))
                                                              .Select(g2=> new Role{
                                                                  H = g2.Key
                                                               }).ToList()
                                                 }).ToList()
                        }).ToList();    

这个想法很简单:

  1. 创建Dictionary<string, RWP>字典 - Dictionary<string, RWP> (将其命名为rwps):

     // foreach row in datatable string strRWP = row["RWP"]; if (!rwps.ContainsKey(strRWP)) rwps[strRWP] = new RWP(strRWP); 
  2. 创建并填充Dictionary<string, Dictionary<string, RWP>> = {role name to RWP}的字典。 只需预约行并填写此词典(将其命名为dicRoles):

     // foreach row in datatable string strRole = row["Role"], strRWP = row["RWP"]; if (!dicRoles.ContainsKey(strRole)) dicRoles[strRole] = new Dictionary<string, RWP>(); if (!dicRoles[strRole].ContainsKey(strRWP)) dicRoles[strRole][strRWP] = rwps[strRWP]; 
  3. Dictionary<string, Dictionary<string, RWP>> dicRoles创建Dictionary<string, Role> roles

     foreach (var pair in dicRoles) roles[pair.Key] = new Role(pair.Key, pair.Value.Values.ToList(); 
  4. 然后创建并填充Dictionary<string, Dictionary<string, Role>> dicServices。

     // foreach row in datatable string strService = row["Service"], strRole = row["Role"]; if (!dicServices.ContainsKey(strService)) dicServices[strService] = new Dictionary<string, Role>(); if (!dicServices[strService].ContrainsKey(strRole)) dicServices[strService][strRole] = roles[strRole]; 
  5. 重复步骤3以从dicServices创建服务。

  6. 重复步骤3-4以创建设施

请记住,这不是最佳代码。 我只是想更轻松地解释我的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM