首页 > 解决方案 > 检索列表中先前的索引记录(如果存在)

问题描述

我正在使用 .NET 3.5 。我的要求是遍历按日期降序排列的对象列表,找到特定记录的匹配项,捕获该对象,然后,如果在此之前的日期存在记录,这意味着捕获的对象的索引减一(如果存在),也捕获此对象,这意味着我的输出列表可以有一条记录或两条记录,具体取决于是否有以前的日期记录。有没有一种干净的方法来实现这一目标?

我尝试捕获匹配记录的索引并通过向索引添加 -1 来获取前一个索引>>如果前一个元素不存在,则索引超出范围异常的风险。

如何避免索引越界异常,但检查前一个元素是否存在(如果存在)?我确信有一种更清洁的方式来做这件事,而不是我正在尝试的方式。因此,如果有更好的方法可以做到这一点,我会向您寻求建议......

任何建议都受到高度赞赏。谢谢

标签: c#

解决方案


看看下面。对象只是一个 datetimeoffset,但应该说明 LINQ 查询。您正在寻找 .Top(2) (如果您需要按某些东西分组,这可能会更复杂):

下面是 LinqPad 示例,但应该很容易粘贴到控制台应用程序中。

void Main()
{
    var threeItems = new List<DateTimeOffset>(new[] { DateTimeOffset.Now, DateTimeOffset.Now.AddDays(-1), DateTimeOffset.Now.AddDays(-2) });
    var twoItems = new List<DateTimeOffset>(new[] { DateTimeOffset.Now, DateTimeOffset.Now.AddDays(-1) });
    var oneItem = new List<DateTimeOffset>(new[] { DateTimeOffset.Now });

    ShowItems(GetItems(threeItems));
    ShowItems(GetItems(twoItems));
    ShowItems(GetItems(oneItem));
}

IEnumerable<DateTimeOffset> GetItems(List<DateTimeOffset> items)
{
    return items
        .OrderByDescending(i => i)
        .Select(i => i)
        .Take(2);
}

void ShowItems(IEnumerable<DateTimeOffset> items)
{
    Console.WriteLine("List of Items:");

    foreach (var item in items)
    {
        Console.WriteLine(item);
    }
}

推荐阅读