wpf - "Week of the year"算法需要改进

标签 wpf algorithm c#-4.0

我有一个算法,它扫描从 .csv 文件(大约 3700 行)读取的数据,并通过为当年的每个星期日运行 count++ 并将计数值指定为来评估每个条目在一年中的哪个交易周当日期在该周内时的交易周。

它工作正常,但性能滞后。这是使用 Task.Factory.StartNew 运行的第三个函数(我也尝试过 parallel.Invoke)。

时序测试结果。

之前:00:00:05.58

之后:00:00:23.27

更新

在设置每个交易周后添加休息时间。时间有所改善,但仍然很慢。

新时间:00:00:15.74

出于我们的目的,一年中的第一个星期是第 1 周(不是第 0 周),定义为从一年中的第一天到星期日。如果一年的第一天是星期日,则第 1 周的长度为 1 天。

private void SetDefiniteWeeks()
        {
            string FileLoc = FilePath + Market + ".csv";
            string[] Data = File.ReadAllLines(FileLoc);
            var FileData = from D in Data
                           let DataSplit = D.Split(',')
                           select new
                           {
                               Date = DateTime.Parse(DataSplit[0]),
                               ClosingPrice = double.Parse(DataSplit[4])
                           };

            //assign each date to it's relevant week
            TradingWeek TW;
            List<TradingWeek> tradingWeek = new List<TradingWeek>();
            foreach (var pe in FileData)
            {
               // DateTime dt = pe.Date;
                int Year = pe.Date.Year;
                string End_of_Week = "Sunday";
                int WeekCount = 0;

                DateTime LoopDate_Begin = new DateTime(Year,1,1);
                DateTime LoopDate_End = new DateTime(Year,12,31);
                do
                {
                    if (LoopDate_Begin.DayOfWeek.ToString() == End_of_Week)
                    {
                        WeekCount++;
                        if (LoopDate_Begin.DayOfYear > pe.Date.DayOfYear && LoopDate_Begin.DayOfYear < (pe.Date.DayOfYear + 7))
                        {
                            TW = new TradingWeek { Week = WeekCount, Date = pe.Date };
                            tradingWeek.Add(TW);
                            break;
                        }
                    }
                    LoopDate_Begin = LoopDate_Begin.AddDays(1);

                } while (LoopDate_Begin.Date.ToString() != LoopDate_End.Date.ToString());

            }

        }

请帮忙。

更新

新时代

00:00:06.686

巨大的进步。感谢大家的帮助。

修改后的代码:

    CalendarWeekRule cw = CalendarWeekRule.FirstDay;
    var calendar = CultureInfo.CurrentCulture.Calendar;
    var trad_Week = (from pe in FileData
                        select new TradingWeek
                        {
                        Date = pe.Date,
                        Week = (calendar.GetWeekOfYear(pe.Date, cw,DayOfWeek.Sunday))
                        }).ToList();

最佳答案

我不确定这是否是您想要的,但在阅读评论后我觉得这可能有效(?)

var calendar = CultureInfo.CurrentCulture.Calendar;
var tradingWeek = (from pe in FileData
                  select new TradingWeek
                  {
                    Date = pe.Date,
                    Week = calendar.GetWeekOfYear(pe.Date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
                  }).ToList();

编辑:更改为 CalendarWeekRule.FirstDay 因为它是(更多?)OP 正在寻找的东西。

关于wpf - "Week of the year"算法需要改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3355137/

相关文章:

wpf - 委托(delegate)命令和路由命令

wpf - 多个资源字典,选择一个

algorithm - 多源多目的地最短路径

python - 如果未给出速度标签本身,如何从 gpx 文件计算速度?

c# - 如何删除在使用属性/字段将自身显示为字符串方面有所不同的重复代码?

c# - 使用 Entity Framework 插入引用其他表中的记录的记录

wpf - 包装面板未正确调整大小

c# - HttpWebRequest 因异步和等待而随机失败

c++ - copy_if 算法在这里值得吗?

c# - 如何动态地将条件和方法传递给递归方法