0

我正在创建一个可以从 dicom 文件中读取的类。这基本上是一个包含大量对象的二进制文件。我想创建一个可以做到这一点的实体类。所以我设计了以下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Medicom
{
    public class DDocument : IEnumerable<DDataElement>
    {
        /// <summary>
        /// Creates a new DDocument from a file.
        /// </summary>
        /// <param name="path">The path of the file to load </param>
        /// <returns>An DDocument that contains the Dicom information from the file</returns>
        public static DDocument Load(string path)
        {
            return DDocument.Load(new FileStream(path, FileMode.Open)); 
        }

        /// <summary>
        /// Creates a new XDocument instance by using the specified stream.
        /// </summary>
        /// <param name="stream">The stream that contains the Dicom information.</param>
        /// <returns>An DDocument that contains the Dicom information from the stream.</returns>
        public static DDocument Load(Stream stream)
        {
            //Logic here to read the whole stream and List<DDataElement> Data with all the data
        }

        /// <summary>
        /// Gets or sets a list with MetaInformation containing DDataElements
        /// </summary>
        public List<DDataElement> Data
        {
            get;
            set;
        }

        /// <summary>
        /// Returns an enumerator that can be used to iterate through the DDocument
        /// </summary>
        /// <returns>An IEnumerator that can be used to iterate through the DDocument</returns>
        public IEnumerator<DDataElement> GetEnumerator()
        {
            foreach (DDataElement dataElement in Data)
            {
                yield return dataElement;
            }
        }
    }
}

我想知道你是怎么想的。你会在这门课上做出什么改变吗?

4

4 回答 4

3

两件事情:

首先,您应该FileStream在完成后关闭它:

public static DDocument Load(string path)
{
    using(FileStream fs = new FileStream(path, FileMode.Open)) {
        return DDocument.Load(fs); 
    }
}

二、List已经完美无缺IEnumerable!你应该使用它!

public IEnumerator<DDataElement> GetEnumerator()
{
    return (IEnumerator<DDataElement>)Data.GetEnumerator();
}
于 2010-12-20T20:04:11.297 回答
2

在建议方面,我会让你的类名更有意义。DicomDocument 和 DicomElement 更具描述性,其他任何使用您的代码的人都会立即知道它们是什么(特别是如果他们熟悉 DICOM 结构)。

于 2010-12-20T20:04:12.690 回答
1

关于这个类的消费者将如何访问该类中的数据,我会再问自己几个问题:

  • 他们是否需要随机访问列表中的 DicomDataElements?还是他们会简单地枚举列表?
  • 如果您允许随机访问,您将如何在列表中搜索正确的 DicomDataElement?
  • 您是否允许用户将 DicomDataElements 插入或添加到列表中?
  • 您是否打算支持再次将文件写回磁盘?即,您是否必须以正确的顺序重建标签?

我的意思是,您可能想要一种更强大的方式将 DicomDataElements 存储在 DicomDocument 中,并且您可能想要通过 IEnumerable 以外的其他方式访问标签。对于 DICOM 文件,SortedDictionary 可能是保存 DICOM 数据元素列表的最佳方式。它可以通过 DICOM 标签使它们保持正确的顺序,并提供对标签的随机访问。您可能还希望类上的索引器提供对标签的随机访问。

于 2010-12-22T14:38:15.540 回答
0

有许多开源的基于 JAVA 的 DICOM 实现,例如dcm4che2。您是否考虑过移植他们的实现?

于 2010-12-20T20:01:52.643 回答