Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用时间戳过滤c#列表,每5秒取第一条记录_C#_List_Linq - Fatal编程技术网

使用时间戳过滤c#列表,每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 我试着根

我有一个场景,比如根据计时过滤记录。这是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
我试着根据如下所示的时间对数据进行分组

 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;
            });