Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/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# 如何根据时间段对运行时记录进行排序?_C#_.net - Fatal编程技术网

C# 如何根据时间段对运行时记录进行排序?

C# 如何根据时间段对运行时记录进行排序?,c#,.net,C#,.net,我有下面的代码,这是我的工作很好。 出于演示目的,我只在列表中实时添加了几条记录。此列表每秒不断添加新值。 问题是如何根据时隙对实时数据进行排序? 将下面的代码托管到持续运行的webjob中 public class MyObject { public double Value { get; set; } public DateTime Time { get; set; } public DateTime GetStartOfPeriodByMins(int numM

我有下面的代码,这是我的工作很好。 出于演示目的,我只在列表中实时添加了几条记录。此列表每秒不断添加新值。 问题是如何根据时隙对实时数据进行排序? 将下面的代码托管到持续运行的webjob中

public class MyObject 
{
    public double Value { get; set; }
    public DateTime Time { get; set; }

    public DateTime GetStartOfPeriodByMins(int numMinutes) 
    {
        int oldMinutes = Time.Minute;
        int newMinutes = (oldMinutes / numMinutes) * numMinutes;

        DateTime startOfPeriod = new DateTime(Time.Year, Time.Month, Time.Day, Time.Hour, newMinutes, 0);

        return startOfPeriod;
    }
}


List<MyObject> inputList = new List<MyObject>();

inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 0), Value = 12});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 2), Value = 11});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 5), Value = 13});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 15), Value = 14});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 45), Value = 12});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 55), Value = 11});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 16, 0), Value = 13});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 16, 1), Value = 16});


var resultSet = inputList
    .GroupBy(i => i.GetStartOfPeriodByMins(1))
    .Select(gr =>
        new 
        {
            StartOfPeriod = gr.Key,
            Min = gr.Min(item => item.Value),
            Max = gr.Max(item => item.Value),
            Open = gr.OrderBy(item => item.Time).First().Value,
            Close = gr.OrderBy(item => item.Time).Last().Value
        });

var my = resultSet.ToList();
公共类MyObject
{
公共双值{get;set;}
公共日期时间{get;set;}
公共日期时间GetStartToPeriodByMins(整数)
{
int oldMinutes=时间。分钟;
int newMinutes=(oldmines/numMinutes)*numMinutes;
DateTime startOfPeriod=新的日期时间(Time.Year,Time.Month,Time.Day,Time.Hour,newMinutes,0);
返回起始时间段;
}
}
List inputList=新列表();
Add(newmyobject(){Time=newdatetime(2020,10,10,9,15,0),Value=12});
睡眠(1000);
Add(newmyobject(){Time=newdatetime(2020,10,10,9,15,2),Value=11});
睡眠(1000);
Add(newmyobject(){Time=newdatetime(2020,10,10,9,15,5),Value=13});
睡眠(1000);
Add(newmyobject(){Time=newdatetime(2020,10,10,9,15,15),Value=14});
睡眠(1000);
Add(newmyobject(){Time=newdatetime(2020,10,10,9,15,45),Value=12});
睡眠(1000);
Add(newmyobject(){Time=newdatetime(2020,10,10,9,15,55),Value=11});
睡眠(1000);
Add(newmyobject(){Time=newdatetime(2020,10,10,9,16,0),Value=13});
睡眠(1000);
Add(newmyobject(){Time=newdatetime(2020,10,10,9,16,1),Value=16});
var resultSet=inputList
.GroupBy(i=>i.GetStartOfPeriodByMins(1))
.选择(gr=>
新的
{
StartOfPeriod=组键,
最小值=gr.Min(项目=>项目值),
Max=gr.Max(项目=>item.Value),
Open=gr.OrderBy(item=>item.Time).First().Value,
Close=gr.OrderBy(item=>item.Time).Last().Value
});
var my=resultSet.ToList();
这里的时间间隔是1分钟,所以每分钟它都会给我一个单独的值,即分高分低分低分


我想处理
inputList
中的数据,以便在每1分钟之后,我将获得最近1分钟的最新数据集,以便我可以使用它进行进一步计算。

因为它是continues inserts(add),所以您可以在列表中使用SortedSet

public class MyObjectComparer : IComparer<MyObject>
{
    public int Compare(MyObject x, MyObject y)
    {
        return x.Time.CompareTo(y.Time);
    }
}

var inputList = new SortedSet<MyObject>(new MyObjectComparer());

inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 0), Value = 12});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 2), Value = 11});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 5), Value = 13});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 15), Value = 14});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 45), Value = 12});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 15, 55), Value = 11});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 16, 0), Value = 13});
Thread.Sleep(1000);
inputList.Add(new MyObject() {Time = new DateTime(2020, 10, 10, 9, 16, 1), Value = 16});


谁在没有提供任何输入的情况下将其标记为关闭:(试着给出一些代码片段,我可以试用。这些类型的问题对许多用户来说都非常棘手和有用。我猜有人将其标记为关闭,因为不清楚您在这里问的是什么。“inputList将从API获得连续的新数据”到底意味着什么?哦,好的,我已经在azure webjob中托管了这段代码,所以api是websocket api,它不断地给我票证数据,我正在将这些数据添加到输入列表中…请指导如何对其进行排序非常感谢…有没有办法在新列表中只保留当前1分钟或5分钟的数据,并且在1分钟或5分钟后它将清除旧数据?没有,您已经做出了决定自身持久化和TTL(生存时间)声明。好的,我想我需要创建一个新的列表,在那里我可以维护Inputlist中最新的1分钟或5分钟的数据。对吗?你能想到的任何示例代码片段,我也会从我的末端尝试,比如使用MemoryCache Thanks。我已经用
MyObject
上的一些属性更新了答案,这些属性应该支持你的请求inutes…您必须“手动”运行列表并删除那些
IsDead==true
,对于必须持久化的列表也是如此。
public class MyObject 
{
    public double Value { get; set; }
    public DateTime Time { get; set; }
    
    public DateTime Created { get; } = DateTime.Now;
    public DateTime Ttl { get; } = DateTime.Now.AddMinues(5);
    public DateTime? Persisted { get; set; }

    public bool IsDead => DateTime.Now > Ttl;
    public bool IsPersisted => Persisted.HasValue;
    public bool TimeToPersist => IsPersisted == false && DateTime.Now > Create.AddMinutes(2);

    public DateTime GetStartOfPeriodByMins(int numMinutes) 
    {
        int oldMinutes = Time.Minute;
        int newMinutes = (oldMinutes / numMinutes) * numMinutes;

        DateTime startOfPeriod = new DateTime(Time.Year, Time.Month, Time.Day, Time.Hour, newMinutes, 0);

        return startOfPeriod;
    }
}