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>>{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> rolesから作成Dictionary<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 に答える