【发布时间】:2012-04-17 14:45:19
【问题描述】:
我有一个复杂的案例:我有三个 XML 文件,我需要同时读取它们并根据匹配获取结果。下面是一个有效的(但假的)示例,与我正在做的几乎相似。
例如,我有两个 xml 文件,两者相似,但在标签和属性方面,但内容(语言)不同。我正在同时阅读两种语言,就像在 C# 文件中的代码中一样:
XElement x1 = XElement.Load (@"abc.xml");
XElement x2 = XElement.Load (@"xyz.xml");
var ch = from var1 in x1.Elements("language1")
where var1.Attribute("index").Value == "1"
from var2 in x2.Elements("language2")
where var2.Attribute("index").Value == var1.Attribute("index").Value
select dictChapter as new
{
sentenceNumber = var1.Attribute("index").Value,
SentenceInLanguage1 = var1.Attribute("text").Value,
SentenceInLanguage2 = var2.Attribute("text").Value,
};
ListBox.DataContext = ch;
这里的问题是,x1 包含 1000 个句子,所以 x2。上面的逻辑就像一个嵌套循环一样工作,这大大减慢了处理速度。它像
x1.1 -> x2.1:1000
x1.2 -> x2.1:1000
或
for i in x1
for j in x2
有没有更好更有效的方法从x1和x2中选择句子,其中x1的句子id等于x2的句子id?
【问题讨论】:
-
您是否对此进行了调试或分析以查看繁重的处理发生在哪里?如果较重的处理来自将文件数据读入内存或进行匹配,那么了解可能会有好处。
-
我对调试工具了解不多。但是当我使用简单的调试,但是执行以下语句时需要时间
lstBox.DataContext = ch -
同上,当我只用一种语言从一个文件中读取时,几乎不需要时间,但是当我从两个文件中读取时,如上所述,时间呈指数增长。
-
如果有两个列表框,您可能希望尝试在每个列表框上并行分配 DataContext。您的代码没有显示您在所有过滤后所做的事情,所以我不确定挂断之后是什么。它可能与未被访问/读取的数据有关,然后分配给列表框,直到它被实际使用。 LINQ 就是这样做的。
-
这正是问题所在,我只有一个ListBox,无法将两个dataItems绑定到一个List box。
标签: c# .net performance linq linq-to-xml