2015-06-29 37 views
-2

我有这样的发现与以#开头的文本运行,但我得到一个空的顺序背:找到特定文本在运行

IEnumerable<Run> runs = doc.Descendants<Run>(). 
    Where<Run>(r => r.Descendants<Text>().First<Text>().Text[0] == '#'); 

,因为下面给我4个结果这不可能是正确的:

IEnumerable<Text> t = doc.Descendants<Text>(). 
     Where<Text>(txt => txt.Text[0] == '#'); 

我该怎么做?

+0

我明白了,但我只用#文字... – Erik

+0

我已将我的评论移至答案。我怀疑你会发现有一些你并不期待的文字元素。 –

回答

2

那么你的第一个片段只给出第一个文本后裔以#开始的运行。您的第二个片段提供了所有以#开头的文本后代。因此,如果你有任何以#开始的非第一个文本后裔的运行,那将会在第二个片段中计数,但不是第一个...

不清楚你实际上想要哪种行为,但是如果你要找到每一个含有开始#文本元素来看,只是改变你的第一个片段到:

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))); 
    } 
} 

(我没有长时间使用这个对象模型,顺便说一句 - 所以你还应该检查是否有像嵌套运行的东西。)

+0

确实你的解决方案有效。日Thnx。仍然:我只有...等等。无论如何... – Erik

+0

@Erik:所以如果你认为你的第一段代码应该工作,在我的答案结束时运行诊断代码,你应该能够明白为什么它没有。 –

相关问题