C# 查找包含特定文本的跑步记录

C# 查找包含特定文本的跑步记录,c#,visual-studio-2013,ms-word,openxml,docx,C#,Visual Studio 2013,Ms Word,Openxml,Docx,我要查找以#开头的文本的运行,但是我得到了一个空序列: IEnumerable<Run> runs = doc.Descendants<Run>(). Where<Run>(r => r.Descendants<Text>().First<Text>().Text[0] == '#'); IEnumerable runs=doc.subjects()。 其中(r=>r.substands().First().Text[

我要查找以#开头的文本的运行,但是我得到了一个空序列:

IEnumerable<Run> runs = doc.Descendants<Run>().
     Where<Run>(r => r.Descendants<Text>().First<Text>().Text[0] == '#');
IEnumerable runs=doc.subjects()。
其中(r=>r.substands().First().Text[0]='#');
这不可能是正确的,因为下面给出了4个结果:

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

我做错了什么?

您的第一个代码片段只给出了第一个文本后代以#开头的运行。第二个代码段提供了以#开头的所有文本子体。因此,如果您有任何以#开头的非第一个文本子体的运行,将在第二个代码段中计算,但不会在第一个代码段中计算

不清楚您真正想要的是哪种行为,但如果您确实想查找包含以
#
开头的文本元素的每次运行,只需将第一个代码片段更改为:

IEnumerable<Run> runs = doc
    .Descendants<Run>()
    .Where<Run>(r => r.Descendants<Text>()
                      .Any<Text>(text => text.Text[0] == '#'));
IEnumerable runs=doc
.后代()
.Where(r=>r.subjects()
.Any(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)));
    }
}
foreach(var在doc.subjects()中运行)
{
控制台。WriteLine(“Run!”);
foreach(run.subjects()中的var textElement)
{
string text=textElement.text;
Console.WriteLine(“-{0}”,text.Substring(0,Math.Min(5,text.Length));
}
}

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

我看到了,但是我运行时只有#-文本…我现在已经将我的注释移动到了答案。我想你会发现有些文本元素是你没有预料到的。你的解决方案确实有效。thnx。不过:我确实只跑了……等等。无论如何…@Erik:所以如果你认为你的第一段代码应该有效,那么在我回答的末尾运行诊断代码,你应该能够看到为什么它没有起作用。