IEnumerable дизайн класса парсера - PullRequest
0 голосов
/ 20 декабря 2010

Я создаю класс, который может читать из файла 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 ]

3 голосов
/ 20 декабря 2010

Две вещи:

Сначала вы должны закрыть 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();
}
2 голосов
/ 20 декабря 2010

С точки зрения рекомендаций, я бы сделал названия ваших классов более значимыми. DicomDocument и DicomElement просто более наглядны, и любой, кто работает с вашим кодом, сразу узнает, что они из себя представляют (особенно если они знакомы со структурой DICOM).

1 голос
/ 22 декабря 2010

Я хотел бы задать себе еще несколько вопросов о том, как потребители этого класса получат доступ к данным в классе:

  • Требуется ли им произвольный доступ к элементам DicomDataElements в вашем списке? Или они просто перечислят список?
  • Если вы разрешите произвольный доступ, как вы будете искать в списке правильный DicomDataElement?
  • Разрешите ли вы пользователю вставлять или добавлять DicomDataElements в список?
  • Собираетесь ли вы поддержать запись файла обратно на диск? Т.е. нужно ли восстанавливать метки в правильном порядке?

Я понял, что вам, вероятно, нужен более надежный способ хранения ваших DicomDataElements в DicomDocument, и вам, вероятно, нужны другие способы доступа к тегам, кроме IEnumerable. В случае файлов DICOM, SortedDictionary, вероятно, является лучшим способом сохранить список элементов данных DICOM. Он может держать их в правильном порядке по тегу DICOM и предоставит произвольный доступ к тегам. Вы также, вероятно, хотите, чтобы индексатор класса предоставлял произвольный доступ к тегам.

0 голосов
/ 20 декабря 2010

Существует ряд реализаций DICOM на основе JAVA с открытым исходным кодом, таких как dcm4che2 .Рассматривали ли вы перенос их реализации?

...