Rio*_*ams 5 c# linq asp.net-mvc grouping
我今天遇到了一个问题,我已经被困了一段时间,试图得到我正在寻找的结果.
我目前有一个类似于以下的类:
public class InstanceInformation
{
public string PatientID {get; set;}
public string StudyID {get; set;}
public string SeriesID {get; set;}
public string InstanceID {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我有一个List<InstanceInformation>,我正在尝试使用LINQ(或其他任何方法生成基于此列表的路径(对于文件目录),类似于以下内容:
PatientID/StudyID/SeriesID/InstanceID
Run Code Online (Sandbox Code Playgroud)
我的问题是数据当前是非结构化的,因为它出现在前面提到的表单(List)中,我需要一种方法来对具有以下约束的所有数据进行分组:
我目前有一些类似于此的东西:
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from studyGroups in
(from instance in patientGroups
group instance by instance.StudyID)
from seriesGroup in
(from instance in studyGroups
group instance by instance.SeriesID)
from instanceGroup in
(from instance in seriesGroup
group instance by instance.InstanceID)
group instanceGroup by patientGroups.Key;
Run Code Online (Sandbox Code Playgroud)
它只是按PatientID对我的所有InstanceID进行分组,并且在这个大规模分组之后很难剔除所有数据,以查看它们之间的区域(StudyID/SeriesID)是否丢失.解决这个问题的任何其他方法都非常受欢迎.
这主要是为了对对象进行分组 - 因为我需要迭代它们(使用foreach)
Eri*_*ert 11
我不知道你提出的查询是你真正想要或需要的查询,但假设它是,让我们考虑是否有更好的方法来编写它.
您想要查看的地方是C#4规范的第7.16.2.1节,为方便起见,我在此引用其中的一部分:
带延续的查询表达式
from ... into x ...
Run Code Online (Sandbox Code Playgroud)
被翻译成
from x in ( from ... ) ...
Run Code Online (Sandbox Code Playgroud)
明白了吗?让我们来看一下我用星星标记的查询片段:
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from studyGroups in
**** (from instance in patientGroups
group instance by instance.StudyID) ****
from seriesGroup in
(from instance in studyGroups
group instance by instance.SeriesID)
from instanceGroup in
(from instance in seriesGroup
group instance by instance.InstanceID)
group instanceGroup by patientGroups.Key;
Run Code Online (Sandbox Code Playgroud)
我们在这里
from studyGroups in ( from ... ) ...
Run Code Online (Sandbox Code Playgroud)
规范说这相当于
from ... into studyGroups ...
Run Code Online (Sandbox Code Playgroud)
所以我们可以将您的查询重写为
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from instance in patientGroups
group instance by instance.StudyID into studyGroups
from seriesGroup in
**** (from instance in studyGroups
group instance by instance.SeriesID) ****
from instanceGroup in
(from instance in seriesGroup
group instance by instance.InstanceID)
group instanceGroup by patientGroups.Key;
Run Code Online (Sandbox Code Playgroud)
再来一遍.现在我们有
from seriesGroup in (from ... ) ...
Run Code Online (Sandbox Code Playgroud)
并且规范说这是相同的
from ... into seriesGroup ...
Run Code Online (Sandbox Code Playgroud)
所以重写它:
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from instance in patientGroups
group instance by instance.StudyID into studyGroups
from instance in studyGroups
group instance by instance.SeriesID into seriesGroup
from instanceGroup in
**** (from instance in seriesGroup
group instance by instance.InstanceID) ****
group instanceGroup by patientGroups.Key;
Run Code Online (Sandbox Code Playgroud)
然后再次!
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from instance in patientGroups
group instance by instance.StudyID into studyGroups
from instance in studyGroups
group instance by instance.SeriesID into seriesGroup
from instance in seriesGroup
group instance by instance.InstanceID into instanceGroup
group instanceGroup by patientGroups.Key;
Run Code Online (Sandbox Code Playgroud)
我希望你同意的是更容易阅读.我会通过改变"实例"被使用了六次来表示不同的事情来提高其可读性:
var groups = from instance in instances
group instance by instance.PatientID into patientGroups
from patientGroup in patientGroups
group patientGroup by instance.StudyID into studyGroups
from studyGroup in studyGroups
group studyGroup by studyGroup.SeriesID into seriesGroups
from seriesGroup in seriesGroups
group seriesGroup by seriesGroup.InstanceID into instanceGroup
group instanceGroup by patientGroups.Key;
Run Code Online (Sandbox Code Playgroud)
这是否实际上是你需要解决问题的查询,我不知道,但至少这一个你可以推理,而不是让自己内心试图遵循所有的嵌套.
这种技术称为"查询延续".基本上,这个想法是,到目前为止,continuation在查询中引入了一个新的范围变量.