我有一些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等于源序列中 next 元素的`PageNumber'值减去1(为了本练习,假设源序列中的所有书签在文档中连续出现)他们被提取出来)。
简而言之,我希望最终结果是一系列对,它们代表每个加书签的PDF部分的起始页和结束页。
答案 0 :(得分: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);
}