Получение XML в сеттере - PullRequest
0 голосов
/ 04 ноября 2010

У меня есть объект с несколькими предметами:

public class ObjectT{
  public int ValueA{
    get
    set;
  }

  public string ValueB{
    get;set;
  }

  public int Description{
    get{
      XDocument doc = XDocument.Load(@"xmldocument.xml");
      return (string)doc.Elements("test").Single(t => t.Element(ValueB).Value);
  }
}

Возможно, Linq не идеален, но вы поймете, что это за идея.Я читаю описание из xml, основываясь на других свойствах в классе.Тем не менее, мне не нравится, как я должен читать из XML все время.Представьте, что я хочу сделать 1000 из этих объектов с 100 различными значениями описания.Мне нужно было сделать 1000 операций чтения в файл XML.

Есть ли лучший (более быстрый) способ сделать это.

сценарий использования

Я хочу сделать следующее:

ObjectT t = new ObjectT();
t.ValueA = 1;
string test = t.Description;

ObjectT t1 = new ObjectT;
t.ValueA = 2;
string test2 = t.Description;

...

Итак, я хочу уменьшить IO до xml, потому чтохочу создать загрузку объектов.

Ответы [ 4 ]

2 голосов
/ 04 ноября 2010

На ум приходит несколько вещей:

  • Чтобы уменьшить IO, прочитайте файл XML один раз при инициализации класса.
  • Создайте Dictionary<string,int> для хранения значения для каждогоЗначение описания и использовать его в качестве кэша.

XDocument doc;
Dictionary<string,int> dict;

public myObject()
{
  doc = XDocument.Load(@"xmldocument.xml");
  dict = new Dictionary<string,int>();
}

public int Description{
 get{
  if(!dict.ContainsKey(ValueB))
    dict.Add( ValueB, 
              (int)doc.Elements("test").Single(t => t.Element(ValueB).Value));

  return dict[ValueB];
  }
}
1 голос
/ 04 ноября 2010

Вы говорите, что хотите иметь тысячи таких объектов, которые читаются из этого XML-документа.Но вы не хотите перезагружать этот XML-документ снова и снова.

Итак, напишите статический класс-оболочку для этого XML-документа, который загружает его один раз.Укажите единственный метод, который извлекает требуемое значение и считывает данные из кэша в памяти XML-документа.

Свойство ObjectT.Description затем вызывает этот метод для получения данных.Поскольку класс-оболочка является статическим, создается только один его экземпляр, и все экземпляры вашего ObjectT будут использовать его.Кроме того, документ XML загружается только один раз.

0 голосов
/ 04 ноября 2010

По крайней мере, вы можете сохранять документацию загруженной во время создания объектов.

0 голосов
/ 04 ноября 2010

Разве вы не можете просто сделать

public class Object{

static XDocument doc;
static LoadXml()
{
    doc = XDocument.Load(@"xmldocument.xml");
}

  public int ValueA{
    get
    set;
  }

  public string ValueB{
    get;set;
  }

  public int Description{
    get{
      return (string)doc.Elements("test").Single(t => t.Element(ValueB).Value);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...