简化双重foreach指令

Maj*_*tic -1 c# ms-office

我需要浏览一个word文档并检索一些文本框以便修改它们.

但我需要先计算它们,我认为我所写的内容效率很低.

我想知道是否可以简化以下内容:

foreach (Microsoft.Office.Interop.Word.HeaderFooter OHeader in documentOld.Sections[1].Headers)
{
    foreach (Microsoft.Office.Interop.Word.Shape shape in OHeader.Shapes)
    {
        if (shape.Name.Contains("Text Box"))
        {
            listTextBox.Add(new KeyValuePair<string, string>(shape.Name.ToString(), shape.TextFrame.TextRange.Text.ToString()));
        }
    }
}

int count = listTextBox.Count();
Run Code Online (Sandbox Code Playgroud)

我想知道在形状中有多少包含"文本框"的元素.

Cri*_*scu 5

我看到有两种方法可以做到这一点.

使用LINQ语法:

var count = (
  from OHeader in documentOld.Sections[1].Headers
  from shape in OHeader.Shapes
  where shape.Name.Contains("Text Box")).Count();
Run Code Online (Sandbox Code Playgroud)

或者,使用IEnumerable扩展方法:

var count = documentOld.Sections[1].Headers
              .SelectMany(h => h.Shapes)
              .Count(s => s.Name.Contains("Text Box"));
Run Code Online (Sandbox Code Playgroud)

请注意KeyValuePair,由于您只想计算与某些条件匹配的形状数,因此您的版本效率低下,因为它会不必要地创建列表和s.除此之外,嵌套foreach块对于性能来说是好的,但可能缺乏与LINQ等效的可读性.

此外,请注意我还没有测试上面的代码.