C# 列表中元素之间的时间跨度差异

C# 列表中元素之间的时间跨度差异,c#,linq,C#,Linq,我有一个包含以下对象的列表: public class DomainTimeErrors { public int DomainId { get; set; } public int JobId { get; set; } public DateTime? FinishedAt { get; set; } public string Domain { get; set; } public string Url { get; set; } } 如何获取Ur

我有一个包含以下对象的
列表

public class DomainTimeErrors
{
    public int DomainId { get; set; }
    public int JobId { get; set; }
    public DateTime? FinishedAt { get; set; }
    public string Domain { get; set; }
    public string Url { get; set; }
}
如何获取
Url
属性中具有相同值的对象,其中
TimeSpan
FinishedAt
中的值之间的时间间隔大于1小时

编辑:

从以下列表中:

var list = new List<DomainTimeErrors>
{
new DomainTimeErrors { DomainId = 1, JobId = 1, FinishedAt = "2017-12-01 12:00", Domain = "so.com", Url = "so.com/id=1" },
new DomainTimeErrors { DomainId = 1, JobId = 2, FinishedAt = "2017-12-01 12:55", Domain = "so.com", Url = "so.com/id=1" },
new DomainTimeErrors { DomainId = 1, JobId = 3, FinishedAt = "2017-12-01 13:55", Domain = "so.com", Url = "so.com/id=1" },
new DomainTimeErrors { DomainId = 1, JobId = 4, FinishedAt = "2017-12-01 14:00", Domain = "so.com", Url = "so.com/id=1" },
new DomainTimeErrors { DomainId = 1, JobId = 11, FinishedAt = "2017-12-01 12:00", Domain = "so.com", Url = "so.com/id=2" },
new DomainTimeErrors { DomainId = 1, JobId = 12, FinishedAt = "2017-12-01 12:05", Domain = "so.com", Url = "so.com/id=2" },
new DomainTimeErrors { DomainId = 1, JobId = 13, FinishedAt = "2017-12-01 12:55", Domain = "so.com", Url = "so.com/id=2" },
new DomainTimeErrors { DomainId = 1, JobId = 14, FinishedAt = "2017-12-01 12:56", Domain = "so.com", Url = "so.com/id=2" }
}
var list=新列表
{
新域TimeErrors{DomainId=1,JobId=1,FinishedAt=“2017-12-01 12:00”,Domain=“so.com”,Url=“so.com/id=1”},
新域TimeErrors{DomainId=1,JobId=2,FinishedAt=“2017-12-01 12:55”,Domain=“so.com”,Url=“so.com/id=1”},
新域TimeErrors{DomainId=1,JobId=3,FinishedAt=“2017-12-01 13:55”,Domain=“so.com”,Url=“so.com/id=1”},
新域时间错误{DomainId=1,JobId=4,FinishedAt=“2017-12-01 14:00”,Domain=“so.com”,Url=“so.com/id=1”},
新域TimeErrors{DomainId=1,JobId=11,FinishedAt=“2017-12-01 12:00”,Domain=“so.com”,Url=“so.com/id=2”},
新域TimeErrors{DomainId=1,JobId=12,FinishedAt=“2017-12-01 12:05”,Domain=“so.com”,Url=“so.com/id=2”},
新域TimeErrors{DomainId=1,JobId=13,FinishedAt=“2017-12-01 12:55”,Domain=“so.com”,Url=“so.com/id=2”},
新域TimeErrors{DomainId=1,JobId=14,FinishedAt=“2017-12-01 12:56”,Domain=“so.com”,Url=“so.com/id=2”}
}

我只想得到其中一个,其中
Url=“so.com/id=1”
,因为最早和最晚的时间差超过1小时,使用Linq查询,我希望它看起来像

from a in List
join b in List
  on a.Url equals b.Url
where (b.FinishedAt - a.FinishedAt).TotalHours>=1
select b;
然后,您可以使用分组和选择器来筛选不需要的值

编辑 考虑到你的编辑,我现在希望它看起来更像这样

from i in List
where i.FinishedAt != null
order by i.FinsihedAt 
group i by i.Url into g
where (g.Last().FinsihedAt -g.First().FinsihedAt ).TotalHours >=1
select g.Last();

如果您使用Linq来反对,我认为Linq的查询回答了您的问题:

Func<IEnumerable<DomainTimeErrors>, bool> checkdiffrent = (items) =>
{
    var itemsCount=items.Count();
    if (itemsCount == 0 || itemsCount == 1)
      return true;

    var sortedItems=items.OrderBy(a=> a.FinishedAt.Value);
    var firstItem=sortedItems.First();
    var lastItem= sortedItems.Last();
    return (firstItem.FinishedAt- lastItem.FinishedAt).Value.TotalHours > 1;
}

var itemWithFinishDate = DomainTimeErrorsCollection.Where(a=> a.FinishedAt.HasValue).
var result = itemWithFinishDate.GroupBy(i=> i.Url).
                Where(sameUrls => checkdiffrent(sameUrls))
                .SelectMany(a=> a);
Func checkdifferent=(项目)=>
{
var itemscont=items.Count();
如果(ItemScont==0 | | ItemScont==1)
返回true;
var sortedItems=items.OrderBy(a=>a.FinishedAt.Value);
var firstItem=sortedItems.First();
var lastItem=sortedItems.Last();
返回(firstItem.FinishedAt-lastItem.FinishedAt).Value.TotalHours>1;
}
var itemWithFinishDate=DomainTimeErrorsCollection.Where(a=>a.FinishedAt.HasValue)。
var result=itemWithFinishDate.GroupBy(i=>i.Url)。
其中(sameUrls=>CheckDifferent(sameUrls))
.SelectMany(a=>a);

您尝试过什么?查看多个对象之间共享的多组URL会发生什么?例如,如果三个对象的URL为“https:\\abc.com”,四个对象的URL为“https:\\def.com”,该怎么办?哪一个获胜?如果有5个对象具有相同的url,其中三个对象的FinishedAt差异大于1h,您想要这三个对象,还是想要差异大于1h的所有具体组合?@TimSchmelter如果超过2个对象具有相同的url,我只想要其中一个,则
FinishedAt
的值并不重要,我只是想得到域名和Url@MikeT,说实话,我不知道怎么做start@TomaszKowalczyk好的,看看下面,你现在应该有一个起点如果你对项目进行排序,然后对它们进行分组,那么组应该保持排序,这将减少你对数据进行排序的次数,此外,group by和select many相互抵消,我认为您所需要的只是一个
选择(a=>a.Last())
@MikeT.Net框架使用快速排序,似乎没有区别,所有项目都要一次排序,或者所有分区都要单独排序。
Func<IEnumerable<DomainTimeErrors>, bool> checkdiffrent = (items) =>
{
    var itemsCount=items.Count();
    if (itemsCount == 0 || itemsCount == 1)
      return true;

    var sortedItems=items.OrderBy(a=> a.FinishedAt.Value);
    var firstItem=sortedItems.First();
    var lastItem= sortedItems.Last();
    return (firstItem.FinishedAt- lastItem.FinishedAt).Value.TotalHours > 1;
}

var itemWithFinishDate = DomainTimeErrorsCollection.Where(a=> a.FinishedAt.HasValue).
var result = itemWithFinishDate.GroupBy(i=> i.Url).
                Where(sameUrls => checkdiffrent(sameUrls))
                .SelectMany(a=> a);