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的第一个值?