我需要浏览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();
我想知道在形状中包含“文本框”的元素数量。
答案 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;
}
}
}