3

我有一个如下所示的数据表。我正在尝试使用 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);
        }
    }
}
4

2 回答 2

3

尝试这个:

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();    
于 2013-09-17T01:54:52.867 回答
1

这个想法很简单:

  1. 创建 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 set of RWP} 的字典。只需 foreach 行并填充此字典(将其命名为 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, Role> rolesDictionary<string, Dictionary<string, RWP>> dicRoles

    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 以创建设施

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

于 2013-09-17T01:04:47.553 回答