我有一个包含几个项目的对象:
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个不同的Description值。我必须对XML文件进行1000次读取。
有更好(更快)的方法吗?
用例
我想做的是以下
ObjectT t = new ObjectT();
t.ValueA = 1;
string test = t.Description;
ObjectT t1 = new ObjectT;
t.ValueA = 2;
string test2 = t.Description;
...
所以我想将IO减少到xml,因为我想创建一个对象加载。
答案 0 :(得分:2)
有些事情会浮现在脑海中:
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 :(得分:1)
您说您希望拥有数千个从此XML文档中读取的对象。但是你不想一遍又一遍地重新加载那个XML文档。
因此,围绕该XML文档编写一个静态包装类,将其加载一次。提供一个检索所需值的方法,并从XML文档的内存缓存中读取数据。
然后,您的ObjectT.Description属性将调用该方法来获取数据。由于包装类是静态的,因此只创建它的一个实例,并且ObjectT的所有实例都将使用它。此外,XML文档仅加载一次。
答案 2 :(得分:0)
你不能这样做吗
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);
}
}
答案 3 :(得分:0)
至少可以在创建对象时保持文档的加载。