如何使用Linq获取Offer列表中的当前项与对应上一项?
用Linq获取列表中每个项的上一项
嘿,针对你给出的Offer类和实例列表,我给你两种实用的Linq实现方式,轻松拿到每个当前项对应的上一项:
首先先回顾下你的基础代码:
public class Offer { public int OfferID { get; set; } public DateTime OfferDate { get; set; } public int CustomerID { get; set; } } List<Offer> oList = new List<Offer>(); oList.Add(new Offer() { OfferID = 1, OfferDate = new DateTime(2018, 01, 01), CustomerID = 1 }); oList.Add(new Offer() { OfferID = 2, OfferDate = new DateTime(2018, 01, 03), CustomerID = 1 }); // 这里假设你后续还有其他Offer实例...
方法一:利用Select的索引重载(适合List这类支持快速索引的集合)
因为List<T>支持O(1)的索引访问,我们可以直接用Select的带索引参数的重载,判断当前项的位置,取前一个索引的元素:
var result = oList.Select((currentOffer, index) => new { Current = currentOffer, Previous = index > 0 ? oList[index - 1] : null // 第一个项没有上一项,返回null });
这个方法简单直接,对于List来说效率很高,毕竟索引访问没有额外开销。
方法二:使用Zip+Prepend(通用所有IEnumerable集合)
如果你的集合不是List,而是其他不支持快速索引的IEnumerable<T>,可以用Zip方法结合Prepend来实现,这种方式更通用:
// 在原列表前面添加一个null,然后和原列表配对 var result = oList.Zip(oList.Prepend((Offer)null), (current, previous) => new { Current = current, Previous = previous });
Prepend会在原序列的最前面插入一个null,然后Zip会把两个序列的对应元素一一配对:
- 原列表第一个元素 ↔ 插入的null(没有上一项)
- 原列表第二个元素 ↔ 原列表第一个元素
- 以此类推,正好对应每个项的上一项
你可以根据自己的集合类型和需求选择合适的方法,两种方式都能得到包含当前项和对应上一项的匿名对象序列~
内容的提问来源于stack exchange,提问作者Impostor
相关产品推荐
相关产品推荐

