简化双重foreach指令

时间:2016-11-10 15:04:05

标签: 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();

我想知道在形状中包含“文本框”的元素数量。

2 个答案:

答案 0 :(得分:5)

我认为有两种方法可以做到这一点。

使用LINQ语法:

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

或者,使用IEnumerable扩展方法:

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

请注意,由于您只想计算符合某些条件的形状数,因此您的版本效率低,因为它会不必要地创建列表和KeyValuePair。除此之外,嵌套foreach块对于性能来说还不错,但可能性与LINQ等价物相比可能不足。

另外,请注意我没有测试上面的代码。

答案 1 :(得分:1)

使用foreach循环保持代码相同仍然只需要在循环之前使用count变量,并在每次找到匹配时将其递增。

int count = 0;
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"))
        {
            ++count;
        }
    }
}