-1

我有一些 LINQ 代码可以从符合特定命名约定的 PDF 中提取书签(使用 Aspose.Pdf):

IOrderedEnumerable<Bookmark> magicBookmarks = (
    from    bookmark in allBookmarks.AsEnumerable()
    where   bookmark.Title.StartsWith(MAGIC_PHRASE) 
    // ...  other criteria
    orderby bookmark.PageNumber ascending
    select  bookmark
);

该类Bookmark有一个名为的属性PageNumber,用于获取书签开始的页码。在我的情况下,书签可以代表 1...n 页的一部分。

我想做的是将此序列转换为另一个序列Tuple<int, int>(或一些可比较的“对”结构),其中每对的 Item1 等于PageNumber源序列中相应元素的值,Item2 等于源序列中的下一个元素减 1(为了本练习,假设源序列中的所有书签在从中提取它们的文档中连续出现)。

简而言之,我希望最终结果是一系列对,代表每个带书签的 PDF 部分的开始页和结束页。

4

1 回答 1

2

您可以Enumerable.Zip通过压缩枚举来使用它,只需跳过第一个元素:

var results = magicBookmarks.Zip(magicBookmarks.Skip(1), 
                                 (a, b) => new 
                                           { 
                                             PageNumber = a.PageNumber, 
                                             PageNumberNext = b.PageNumber - 1 
                                           });

foreach (var item in results)
{
    Console.WriteLine("Page: {0}, Next: {1}", item.PageNumber, item.PageNumberNext);
}
于 2012-07-08T05:31:19.513 回答