2016-11-10 37 views
-1

我需要瀏覽一個單詞文檔並檢索一些文本框以修改它們。簡化雙foreach指令

但我之前需要對它們進行計數,我認爲我寫的實際上效率很低。

我想知道,如果它能夠簡化如下:

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

我想知道哪些包含「文本框」是在形狀有多少元素。

回答

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

值得注意的是,在問題中的代碼使用「包含」,但問題要求等於「等於」可以使用 – TheLethalCoder

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