C# LINQ按日期间隔获取对象

C# LINQ按日期间隔获取对象,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,我正在寻找一个LINQ查询,它将只选择那些日期间隔不超过20秒的对象。例如: AuthenticationEssay[] essays = new AuthenticationEssay[] { new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(20), Success = false }, new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(24

我正在寻找一个LINQ查询,它将只选择那些日期间隔不超过20秒的对象。例如:

AuthenticationEssay[] essays = new AuthenticationEssay[] {
    new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(20), Success = false },
    new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(24), Success = false },
    new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(29), Success = false },
    new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(38), Success = false },
    new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(125), Success = false },
    new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(347), Success = false },
    new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(400), Success = false },
    new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(422), Success = false },
    new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(446), Success = false },
    new AuthenticationEssay() { Date = DateTime.Now.AddSeconds(467), Success = false }
};
我只想选择与下一个对象的日期间隔不超过20秒的对象的第一次出现。在这种情况下,查询应该只返回前4个对象。有什么想法吗(

更新

抱歉,我忘了提到我正在按降序对数组进行排序。因此,是的,数组中的位置不应该对查询有任何影响。

这是怎么回事

var query from i in Enumerable.Range(1, count - 1)
          let current = list[i]
          let previous = list[i - 1]
          // I see some empty positions in your example, nullability check
          where current != null && previous != null
          where (current.Date - previous.Date).TotalSeconds < 20
          select previous;
编辑2:我刚刚读到您正在对结果进行降序排序。在这种情况下,查询将略有不同:

var query from i in Enumerable.Range(1, count - 1)
          let current = list[i]
          let previous = list[i - 1]
          // I see some empty positions in your example, nullability check
          where current != null && previous != null
          where (previous.Date - current.Date).TotalSeconds < 20
          select current;
Enumerable.Range(1,count-1)中来自i的var查询
让电流=列表[i]
let previous=列表[i-1]
//我在你的例子中看到一些空位置,空性检查
其中当前!=null&&previous!=null
其中(上一个日期-当前日期)。总秒数<20
选择当前;

这不太好看,但给你

var result = Enumerable.Range(0, essays.Count() - 1)
    .Select(i => new {Essays1 = essays[i], Essays2 = essays[i + 1]})
    .Where(a => a.Essays2 != null)
    .Where(a => a.Essays2.Date - a.Essays1.Date < new TimeSpan(0, 0, 0, 20))
    .Select(a => a.Essays1);
var result=Enumerable.Range(0,0.Count()-1)
.Select(i=>new{Essays1=散文[i],Essays2=散文[i+1]})
.Where(a=>a.Essays2!=null)
其中(a=>a.Essays2.Date-a.Essays1.Datea.Essays1);
一定要是LINQ吗?我喜欢LINQ,但我想这样的东西会更具可读性

var result = new List<AuthenticationEssay>();
for (var i = 0; i < (essays.Count() - 1); i++)
{
    if (essays[i + 1] != null)
        if (essays[i + 1].Date - essays[i].Date < new TimeSpan(0, 0, 0, 20))
            result.Add(essays[i]);
}
var result=newlist();
对于(var i=0;i<(散文.Count()-1);i++)
{
如果(文章[i+1]!=null)
如果(论文[i+1]。日期-论文[i]。日期<新时间跨度(0,0,0,20))
结果。添加(论文[i]);
}

可能可以使用内置Linq运算符来实现,但在这种情况下,我认为编写特定方法更容易。您可以这样做:

static IEnumerable<AuthenticationEssay> Filter(IEnumerable<AuthenticationEssay> list)
{
    AuthenticationEssay last = null;
    AuthenticationEssay previous = null;
    foreach(var item in list)
    {
        if (last == null)
        {
            // Always return the first item
            yield return item;
        }
        else if ((item.Date - last.Date).TotalSeconds >= 20)
        {
           yield return item;
        }

        previous = last;
        last = item;
    }
    if (previous != null && last != null && (last.Date - previous.Date).TotalSeconds <= 20)
       yield return last;
}
静态IEnumerable筛选器(IEnumerable列表)
{
authenticationLast=null;
authenticationPrevious=null;
foreach(列表中的变量项)
{
if(last==null)
{
//始终返回第一个项目
收益回报项目;
}
否则如果((item.Date-last.Date).TotalSeconds>=20)
{
收益回报项目;
}
上一次=最后一次;
最后一项=项目;
}

如果(previous!=null&&last!=null&(last.Date-previous.Date).TotalSeconds如果最后一项是
AddSeconds(465)
,它会被包括在内吗?你说日期间隔不超过20秒是什么意思?你是说DateTime.Now和文章[i].Date之间的差吗?你是指文章[0]和文章[1]之间的差吗?我的意思是在文章[0]和文章[1]之间。但是在我进行比较之前,我正在对数组进行排序。您可以给出一个预期输出的示例吗?不,不起作用。它返回太多不应该在列表中的对象。如果您只需要第一个元素,请调用
first()
方法。谢谢,但我知道如何获取元素的第一次出现。我想要的是获取日期间隔不超过20秒的元素的第一次出现。
static IEnumerable<AuthenticationEssay> Filter(IEnumerable<AuthenticationEssay> list)
{
    AuthenticationEssay last = null;
    AuthenticationEssay previous = null;
    foreach(var item in list)
    {
        if (last == null)
        {
            // Always return the first item
            yield return item;
        }
        else if ((item.Date - last.Date).TotalSeconds >= 20)
        {
           yield return item;
        }

        previous = last;
        last = item;
    }
    if (previous != null && last != null && (last.Date - previous.Date).TotalSeconds <= 20)
       yield return last;
}