目前我正在构建一个可以处理DICOM文件的小型桌面应用程序。我使用C#和.NET编写代码并使用ClearCanvas库。我需要做的一件事是能够显示文件的全部内容,包括所有序列。但是序列是以递归方式完成的,因此每个序列可以在其内部具有更多序列。现在我的代码可以访问前两个级别,但我只是作为测试人员这样做,因为我需要能够访问第n级序列。所以我需要以某种方式自动化这个。这就是我的代码现在的前两个级别。
DicomSequenceItem[] seq = attrs2[i].Values as DicomSequenceItem[];
if (seq != null)
{
for (int j = 0; j < seq.Length; j++)
{
for (int n = 0; n < seq[j].Count; n++)
{
DicomSequenceItem[] level2 = seq[j].ElementAt(n).Values as DicomSequenceItem[];
if(seq[j].ElementAt(n).GetValueType().ToString().Equals("ClearCanvas.Dicom.DicomSequenceItem"))
{
for (int k = 0; k < level2.Length; k++)
{
for (int l = 0; l < level2[k].Count; l++)
{
text += "\t\t" + level2[k].ElementAt(l) + "\r\n";
}
}
}
else
{
text += "\t" + seq[j].ElementAt(n) + "\r\n";
}
}
}
}
任何帮助(代码示例)将不胜感激。
谢谢!
答案 0 :(得分:3)
这是一个简单的递归例程,遍历属性集合中的标记,包括递归遍历集合中可能包含的任何Sequence元素:
void Dump(DicomAttributeCollection collection, string prefix, StringBuilder sb)
{
foreach (DicomAttribute attribute in collection)
{
var attribSQ = attribute as DicomAttributeSQ;
if (attribSQ != null)
{
for (int i=0; i< attribSQ.Count; i++)
{
sb.AppendLine(prefix + "SQ Item: " + attribSQ.ToString());
DicomSequenceItem sqItem = attribSQ[i];
Dump(sqItem, prefix + "\t", sb);
}
}
else
{
sb.AppendLine(prefix + attribute.ToString());
}
}
}
DicomAttributeCollection是Enumerable,因此您只需使用foreach循环来遍历集合中的所有属性。属性本身存储在SortedDictionary中,因此枚举时它们也将按升序排列。
请注意,如果您下载了ClearCanvas库的源代码,您还可以查看属于DicomAttributeCollection类的真实Dump()方法。它遍历集合并将StringBuilder实例写入集合中的所有标记。