Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# LINQ:每X分钟提取一次数据_C#_Linq - Fatal编程技术网

C# LINQ:每X分钟提取一次数据

C# LINQ:每X分钟提取一次数据,c#,linq,C#,Linq,下面是一段创建具有不同日期时间的随机数据的代码 void ExtractEveryXminute() { List<DataHolder> data = new List<DataHolder>(); List<DateTime> randomTimes = new List<DateTime>(); Random r = new Random(); DateTime d = new DateTime(201

下面是一段创建具有不同日期时间的随机数据的代码

void ExtractEveryXminute()
{
     List<DataHolder> data = new List<DataHolder>();
     List<DateTime> randomTimes = new List<DateTime>();
     Random r = new Random();
     DateTime d = new DateTime(2019, 9, 19, 7, 0, 0);

     for (int i = 0; i < 100; i++)
     {
         DataHolder dh = new DataHolder();
         TimeSpan t = TimeSpan.FromSeconds(r.Next(0, 14400));  
         dh.OID = i;
         dh.Value = r.Next(50);
         dh.Snapshottime = d.Add(t);

         data.Add(dh);
      }

      data.OrderBy(o => o.Snapshottime).ToList();

      List<DataHolder> SortedList = data.OrderBy(o => o.Snapshottime).ToList();           

      var query_res = (from s in SortedList group s by new DateTime(s.Snapshottime.Year, s.Snapshottime.Month, s.Snapshottime.Day, s.Snapshottime.Hour, 15, 0));
}

public class DataHolder
{
    public int OID { get; set; }
    public double Value { get; set; }
    public DateTime Snapshottime { get; set; }       
}
void ExtractEveryXminute()
{
列表数据=新列表();
List randomTimes=新列表();
随机r=新随机();
DateTime d=新的日期时间(2019、9、19、7、0、0);
对于(int i=0;i<100;i++)
{
数据持有者dh=新数据持有者();
TimeSpan t=TimeSpan.FromSeconds(r.Next(01400));
dh.OID=i;
dh.值=r.下一个(50);
dh.Snapshottime=d.Add(t);
添加数据(dh);
}
OrderBy(o=>o.Snapshottime).ToList();
List-SortedList=data.OrderBy(o=>o.Snapshottime).ToList();
var query_res=(按新日期时间(s.Snapshottime.Year,s.Snapshottime.Month,s.Snapshottime.Day,s.Snapshottime.Hour,15,0)从分类列表组s中的s开始);
}
公共类数据持有者
{
公共整数OID{get;set;}
公共双值{get;set;}
公共日期时间快照时间{get;set;}
}

我需要每隔15分钟分离一次数据。现在我只得到了7:15:00,8:15:00,9:15:00的约会时间,但这是不正确的。如何从列表中的第一条记录开始提取这些日期,并每15分钟过滤一次?

您可以使用以下方法

TimeSpan interval = new TimeSpan(0, 15, 0); 
var result = SortedList.GroupBy(x=> x.Snapshottime.Ticks/interval.Ticks)
                       .OrderBy(x=>x.Key);
样本输出

更新

根据评论,如果您只需要每组15分钟的第一次,那么您可以使用

var result = SortedList.GroupBy(x=> x.Snapshottime.Ticks/interval.Ticks)
                       .Select(x=>x.First());

您可以使用以下命令

TimeSpan interval = new TimeSpan(0, 15, 0); 
var result = SortedList.GroupBy(x=> x.Snapshottime.Ticks/interval.Ticks)
                       .OrderBy(x=>x.Key);
样本输出

更新

根据评论,如果您只需要每组15分钟的第一次,那么您可以使用

var result = SortedList.GroupBy(x=> x.Snapshottime.Ticks/interval.Ticks)
                       .Select(x=>x.First());

@XDT转换不适用您将永远无法精确到每15分钟的100纳秒时间。所以按时间排序,然后按以下分组:new DateTime(Snapshottime.year,Snapshottime.month,Snapshottime.day,Snapshottime.hour,Snapshottime.minute/15,0),然后从每个组中提取第一个样本。@xdtTransform我需要从对象列表中提取,而不是每15分钟执行一次。我不认为使用LINQ可以实现这种逻辑,如果它很长,很难阅读,对任何项目都不好。您想“选择所有适用的项目,该语句适用的前一个项目的最小值为900s^=15min”jounger@xdtTransform not Applieble您永远不会精确到每15分钟100纳秒的时间。所以按时间排序,然后按以下分组:new DateTime(Snapshottime.year,Snapshottime.month,Snapshottime.day,Snapshottime.hour,Snapshottime.minute/15,0),然后从每个组中提取第一个样本。@xdtTransform我需要从对象列表中提取,而不是每15分钟执行一次。我不认为使用LINQ可以实现这种逻辑,如果它很长,很难阅读,对任何项目都不好。您想“选择所有适用于此语句的前一项至少为900s^=15min的项目”jounger我想我应该从每组中选取第一个值,还是@Josef如果你只想要每个15分钟小组的第一个项目,是的,你可以拿第一个。但从OP上看,我认为您需要以15分钟为间隔将所有数据分组。@约瑟夫已根据您的评论更新了答案。请验证两种方法都是完美的。可以用linq查询每个组并获取这个IORDerenumerable的第一个值吗?我想我应该从每个组中获取第一个值还是@Josef如果你只想要每个15分钟小组的第一个项目,是的,你可以拿第一个。但从OP上看,我认为您需要以15分钟为间隔将所有数据分组。@约瑟夫已根据您的评论更新了答案。请验证两种方法都是完美的。是否可以使用linq查询每个组并获取此IORDerenumerable的第一个值?