IEnumerable解析器类设计

时间:2010-12-20 19:58:28

标签: c# .net parsing ienumerable dicom

我正在创建一个可以从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 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我会问自己一些关于这个类的消费者如何访问该类数据的问题:

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

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

答案 3 :(得分:0)

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