[英]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();
这个想法很简单:
创建Dictionary<string, RWP>
字典 - Dictionary<string, RWP>
(将其命名为rwps):
// foreach row in datatable string strRWP = row["RWP"]; if (!rwps.ContainsKey(strRWP)) rwps[strRWP] = new RWP(strRWP);
创建并填充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];
从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();
然后创建并填充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];
重复步骤3以从dicServices创建服务。
请记住,这不是最佳代码。 我只是想更轻松地解释我的想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.