C# 使用microsoft interop c按页面排序书签#

C# 使用microsoft interop c按页面排序书签#,c#,ms-word,bookmarks,C#,Ms Word,Bookmarks,我有一个由2页组成的word模板文件,每一页都有一个书签,第一页书签名称是A4,第二页书签名称是A3,但是当我从word文档中读取所有书签时,我会按字母顺序获取它们,我希望它们按页面顺序,我如何才能做到这一点 foreach (Bookmark bookMark in MergeResultDoc.Bookmarks) {//IMPORTANTE:IL NOME DEL SEGNALIBRO DEVE ESSERE IL TIPO DI CARTA

我有一个由2页组成的word模板文件,每一页都有一个书签,第一页书签名称是A4,第二页书签名称是A3,但是当我从word文档中读取所有书签时,我会按字母顺序获取它们,我希望它们按页面顺序,我如何才能做到这一点

foreach (Bookmark bookMark in MergeResultDoc.Bookmarks) 
            {//IMPORTANTE:IL NOME DEL SEGNALIBRO DEVE ESSERE IL TIPO DI CARTA
                pagInizio = Convert.ToInt32(pagNum);
                pagNum = bookMark.Range.Information[WdInformation.wdActiveEndPageNumber].ToString();
                addData( pagInizio, pagNum, bookMark.Name);
                iteration++;
            }

使用LINQ
OrderBy

var orderedResults = MergeResultDoc.Bookmarks.OrderBy(d => d.Start).ToList();

您可以读取
书签.Start
值。 这将返回书签在文档中的起始位置。 因此,您可以浏览所有书签,并根据它们的起始位置对它们进行排序

下面是一个代码:

// List to store all bookmarks sorted by position.
List<Bookmark> bmList = new List<Bookmark>();

// Iterate over all the Bookmarks and add them to the list (unordered).
foreach (Bookmark curBookmark in MergeResultDoc.Bookmarks)
{
    bmList.Add(curBookmark);
}

// Sort the List by the Start member of each Bookmark.
// After this line the bmList will be ordered.
bmList.Sort(delegate(Bookmark bm1, Bookmark bm2)
{
    return bm1.Start.CompareTo(bm2.Start);
});
//用于存储按位置排序的所有书签的列表。
List bmList=新列表();
//迭代所有书签并将它们添加到列表中(无序)。
foreach(MergeResultDoc.Bookmarks中的书签路边标记)
{
bmList.Add(路边停车场);
}
//按每个书签的起始成员对列表进行排序。
//在这一行之后,bmList将被排序。
排序(委托(书签bm1,书签bm2)
{
返回bm1.Start.CompareTo(bm2.Start);
});

Document.Boomarks应按字母顺序返回书签


Document.Content.Bookmarks应按书签在文档中出现的顺序返回书签。但是VBA集合文档通常不保证任何内容的特定顺序,因此更安全的做法是读取开头(如ETISO所建议的)并使用该开头进行排序。

您需要一个
.Cast()
;互操作集合不是泛型的。谢谢,我认为这样更好:var orderedResults=mergesultdoc.Bookmarks.Cast().OrderBy(d=>d.pageNum.ToList();但是我得到了以下错误:“Microsoft.Office.Interop.Word.Bookmark”不包含“pagNum”的定义,ideas?没有定义pagNum也有同样的问题@DenisbokorDoh!使用
Start
而不是
pageNum
。我已经更新了我的答案。让我知道这对你是否有效。Hy,谢谢你的回答,有什么原因让我更喜欢这个而不是gleng的吗?我不熟悉LINQ,所以我不能提供这个,但我认为gleng的(修正了用
Cast
替换
OrderBy
)比我的(仍然是一行!)更清晰、更漂亮。