那么你的第一个片段只给出第一个文本后裔以#开始的运行。您的第二个片段提供了所有以#开头的文本后代。因此,如果你有任何以#开始的非第一个文本后裔的运行,那将会在第二个片段中计数,但不是第一个...
不清楚你实际上想要哪种行为,但是如果你做要找到每一个含有开始#
文本元素来看,只是改变你的第一个片段到:
IEnumerable<Run> runs = doc
.Descendants<Run>()
.Where<Run>(r => r.Descendants<Text>()
.Any<Text>(text => text.Text[0] == '#'));
如果你还在惊讶的是,这两个片段给你不同的结果,你可以很容易地检查:
foreach (var run in doc.Descendants<Run>())
{
Console.WriteLine("Run!");
foreach (var textElement in run.Descendants<Text>())
{
string text = textElement.Text;
Console.WriteLine("- {0}", text.Substring(0, Math.Min(5, text.Length)));
}
}
(我没有长时间使用这个对象模型,顺便说一句 - 所以你还应该检查是否有像嵌套运行的东西。)
我明白了,但我只用#文字... – Erik
我已将我的评论移至答案。我怀疑你会发现有一些你并不期待的文字元素。 –