使用时间戳过滤c#列表,每5秒取第一条记录
我有一个场景,比如根据计时过滤记录。这是5秒范围内的第一条记录 例如: 输入数据:使用时间戳过滤c#列表,每5秒取第一条记录,c#,list,linq,C#,List,Linq,我有一个场景,比如根据计时过滤记录。这是5秒范围内的第一条记录 例如: 输入数据: data timings 1452 10:00:11 1455 10:00:11 1252 10:00:13 1952 10:00:15 1454 10:00:17 1451 10:00:19 1425 10:00:20 1425 10:00:21 1459 10:00:23 1422 10:00:24 预期产量 1452 10:00:11 1454 10:00:17 1459 10:00:23 我试着根
data timings
1452 10:00:11
1455 10:00:11
1252 10:00:13
1952 10:00:15
1454 10:00:17
1451 10:00:19
1425 10:00:20
1425 10:00:21
1459 10:00:23
1422 10:00:24
预期产量
1452 10:00:11
1454 10:00:17
1459 10:00:23
我试着根据如下所示的时间对数据进行分组
listSpacialRecords=listSpacialRecords.GroupBy(x => x.timings).Select(x => x.FirstOrDefault()).ToList();
但是使用这个,我只能使用相同的时间过滤数据。
希望有人能帮我解决这个问题
列表中包含大量数据,所以除了在列表中循环外,还有其他方法吗?应该这样做(假设listSpacialRecords是有序的)
仅使用Linq进行此操作是可能的,但对可读性没有好处。假设您的类看起来像这样:
public class DataNode
{
public int Data { get; set; }
public TimeSpan Timings { get; set; }
}
我写了一个扩展方法:
public static IEnumerable<DataNode> TimeFilter(this IEnumerable<DataNode> list, int timeDifference )
{
DataNode LastFound = null;
foreach (var item in list.OrderByDescending(p=> p.Timings))
{
if (item.Timings > LastFound?.Timings.Add(new TimeSpan(0,0,timeDifference)))
{
LastFound = item;
yield return item;
}
}
}
公共静态IEnumerable时间过滤器(此IEnumerable列表,int时差)
{
DataNode LastFound=null;
foreach(list.OrderByDescending中的var项(p=>p.Timings))
{
if(item.Timings>LastFound?.Timings.Add(新时间跨度(0,0,时差)))
{
LastFound=项目;
收益回报项目;
}
}
}
这样就可以这样使用了
var list = new List<DataNode>();
var result = list.TimeFilter(5);
var list=newlist();
var结果=列表。时间过滤器(5);
类似的方法可以使用(模)
假设
- 名单已排好
- 你不在乎它是否跳过了丢失的秒数
- 总有第一个元素
- 这只是在24小时内
var results =
source
.Skip(1)
.Aggregate(
source.Take(1).ToList(),
(a, x) =>
{
if (x.timings.Subtract(a.Last().timings).TotalSeconds >= 5.0)
{
a.Add(x);
}
return a;
});
我得到了您想要的输出。输入是否正常?@CSharpie是的,它将正常。它是存储在数据库中的数据,这意味着您的
.GroupBy
和类似项实际上是SQL或实体的LINQ?或者这是内存处理?你在这里评论了一个答案,即foreach
将是一个令人头痛的问题,你能解释一下原因吗?另外,当你说每5秒一次时,你的意思是“在X行之后,选择X之后至少5秒的下一行”,还是你的意思是“对于第二个间隔0-5、5-10、10-15、15-20等的每一个,取第一排?意思是不同的。在第一种情况下,有13的行后面不会有16的行,但在第二种情况下会有16的行。@LasseVågsætherKarlsen数据不在数据库中。我们正在根据条件将数据从本地文件夹迁移到服务器。列表中包含大量数据,因此foreach将是一个headake@ArunprasanthKV没有办法绕过foreach。我修改了它,使许多记录更有效。谢谢你的输入。不幸的是,me timings属性是datetime,而pivot是Timespan,因此它给出了错误。属性为timespan,则答案为完美+1that@ArunprasanthKV修正了-秒是多少?啊,好吧,它是基线,所以它从0开始,第一条记录包含在结果中,这就是我的想法,我补充道brackets@ArunprasanthKV计时还是计时?模运算符(或你称之为的任何东西)不会产生预期的结果。在问题中给定的数据中,您的查询将返回11、15、20,而不是11、17、23。这显然不是5秒的间隔,而是5秒的间隔。
var list = new List<DataNode>();
var result = list.TimeFilter(5);
var seconds = listSpacialRecords
.First() // get the first element
.Timmings
.TimeOfDay // convert it to TimeSpan
.TotalSeconds; // get the total seconds of the day
var result = listSpacialRecords
.Where(x => (x.Timmings
.TimeOfDay
.TotalSeconds - seconds) % 5 == 0)
// get the difference and mod 5
.ToList();
var results =
source
.Skip(1)
.Aggregate(
source.Take(1).ToList(),
(a, x) =>
{
if (x.timings.Subtract(a.Last().timings).TotalSeconds >= 5.0)
{
a.Add(x);
}
return a;
});