如何将表示1 ... n个部分的元素序列转换为一对/元组序列?

时间:2012-07-08 05:00:34

标签: c# .net linq

我有一些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部分的起始页和结束页。

1 个答案:

答案 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);
}