首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事实问题/逻辑问题

事实问题/逻辑问题
EN

Stack Overflow用户
提问于 2014-05-15 14:08:19
回答 2查看 47关注 0票数 0

事实上,我是代码中的头领,因为这是个烂摊子。但从昨天开始,我的头看上去就像一块石头--“

代码语言:javascript
复制
    #region DateTime foreach Currencies
    static DateTime eurusd = DateTime.Now.AddHours(-1);
    static DateTime eurgbp = DateTime.Now.AddHours(-1);
    static DateTime eurjpy = DateTime.Now.AddHours(-1);
    static DateTime usdjpy = DateTime.Now.AddHours(-1);
    static DateTime gbpjpy = DateTime.Now.AddHours(-1);
    static DateTime gbpusd = DateTime.Now.AddHours(-1);


    static DateTime eurusdm1 = DateTime.Now.AddHours(-1);
    static DateTime eurgbpm1 = DateTime.Now.AddHours(-1);
    static DateTime eurjpym1 = DateTime.Now.AddHours(-1);
    static DateTime usdjpym1 = DateTime.Now.AddHours(-1);
    static DateTime gbpjpym1 = DateTime.Now.AddHours(-1);
    static DateTime gbpusdm1 = DateTime.Now.AddHours(-1);

    static DateTime eurusdh1 = DateTime.Now.AddHours(-1);
    static DateTime eurgbph1 = DateTime.Now.AddHours(-1);
    static DateTime eurjpyh1 = DateTime.Now.AddHours(-1);
    static DateTime usdjpyh1 = DateTime.Now.AddHours(-1);
    static DateTime gbpjpyh1 = DateTime.Now.AddHours(-1);
    static DateTime gbpusdh1 = DateTime.Now.AddHours(-1);

    static DateTime eurusdd1 = DateTime.Now.AddHours(-1);
    static DateTime eurgbpd1 = DateTime.Now.AddHours(-1);
    static DateTime eurjpyd1 = DateTime.Now.AddHours(-1);
    static DateTime usdjpyd1 = DateTime.Now.AddHours(-1);
    static DateTime gbpjpyd1 = DateTime.Now.AddHours(-1);
    static DateTime gbpusdd1 = DateTime.Now.AddHours(-1);
    #endregion

有24种不同的DateTime。

代码语言:javascript
复制
            switch (data.Instrument)
            {

                case "EUR/USD":
                    if (CanUpdate(ref eurusd, "s5"))
                    { InsertData("eurusd", data); }
                    if (CanUpdate(ref eurusdm1, "m1"))
                    { InsertData("eurusdm1", data);}
                    if (CanUpdate(ref eurusdh1, "h1"))
                    { InsertData("eurusdh1", data);}
                    if (CanUpdate(ref eurusdd1, "d1"))
                    { InsertData("eurusdd1", data);} 
            }

一个有6个大小写的开关箱(如上面的一个) (InsertData只是在一个集合中放置了一些对象。"x“=>集合名,data =>对象)

代码语言:javascript
复制
    private bool CanUpdate(ref DateTime date, string timer)
    {
        TimeSpan result = DateTime.Now - date;

        if (timer == "s5")
        {
            int difSeconds = result.Seconds;
            if (difSeconds >= 5)
            {
                date = DateTime.Now;
                return true;
            }
        }
        if (timer == "m1")
        {
            int difMinutes = result.Minutes;
            if (difMinutes >= 1)
            {
                date = DateTime.Now;
                return true;
            }
        }
        if (timer == "h1")
        {
            int difHour = result.Hours;
            if (difHour >= 1)
            {
                date = DateTime.Now;
                return true;
            }
        }
        if (timer == "d1")
        {
            int difDays = result.Days;
            if (difDays >= 1)
            {
                date = DateTime.Now;
                return true;
            }
        }
        return false;
    }

我的"CanUpdate“方法。检查上次更新与如果"if条件“为true之间的时间,它更新"date变量”并返回true,否则返回false。

你可以猜到,这个开关柜大约有70条线路。一个更改需要在整个开关箱上保存。很丑对吧?

我想摆脱这个开关箱,使它更易于维护。我想过把所有的数据都放在不同的列表中。所以看起来是:

代码语言:javascript
复制
    List<String> collectionName;
    List<DateTime> dateTime;
    List<String> timeFrame;

然后对DateTime集合做一个预测,然后执行2嵌套for。有些像:

代码语言:javascript
复制
foreach (DateTime dt in dateTime)
{
    for(i=0; i <= collectionName.Lenght; i++)
    {
        for(j=0; j <= timeFrame.Lenght; j++)
        {
            CanUpdate(ref dt, timeFrame[j])
            InsertData(collectionName[i].ToString(), data)
        }
    }
}

我是在正确的方向上,你甚至理解我想要什么。因为如果你的脑袋和我的脑袋在读完这篇文章后处于同样的状态。对不起:O

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-15 15:43:49

前言

  1. 我会(事实上,我确实)用字典来解决这个问题。
  2. 我不太喜欢Tuple。因此,对于真正的应用程序,我将创建一些struct/class。
  3. 对于答案,我假设它需要处理格式字符串“EUR/美元”和"eurusdm1“(参见GetInsertDataArgument()方法)。
  4. 当然,我还没有对代码进行测试:),但我认为这已经足够得到这个想法了。
  5. 我决定让所有成员都是静态的,因为在原始代码中您的日期时间是静态的。你可以很容易地改变这一点。

代码

代码语言:javascript
复制
class MyClass
{
    private static readonly Dictionary<Tuple<string, string>, DateTime> lastUpdateDateTimes = new Dictionary<Tuple<string, string>, DateTime>();
    private static readonly Dictionary<string, TimeSpan> timeIntervals = new Dictionary<string, TimeSpan>();

    static MyClass()
    {
        timeIntervals.Add("s5", TimeSpan.FromSeconds(5));
        timeIntervals.Add("m1", TimeSpan.FromMinutes(1));
        timeIntervals.Add("h1", TimeSpan.FromHours(1));
        timeIntervals.Add("d1", TimeSpan.FromDays(1));
    }

    private static string GetInsertDataArgument(string instrument, string timeIntervalName)
    {
        string result = instrument.Replace("/", "").ToLower();
        if (timeIntervalName != "s5")
            result = result + timeIntervalName;
        return result;
    }

    private static void Update(string instrument)
    {
        DateTime now = DateTime.Now;
        foreach (var timeInterval in timeIntervals)
        {
            var dateTimeKey = new Tuple<string, string>(instrument, timeInterval.Key);
            if (now - lastUpdateDateTimes[dateTimeKey] < timeInterval.Value)
                continue;
            lastUpdateDateTimes[dateTimeKey] = now;
            InsertData(GetInsertDataArgument(instrument, timeInterval.Key), data);
        }
    }
}

发生什么事了

有两本字典:

  1. lastUpdateDateTimes存储每个货币对和时间间隔的日期时间。元组的第一个成员存储货币对(以“EUR/美元”格式),第二个成员存储时间间隔名称(以"s5“格式)。
  2. timeIntervals保存您的时间间隔。它被填充在类的静态构造函数中。

Update方法是对开关语句和CanUpdate方法的替代。

票数 2
EN

Stack Overflow用户

发布于 2014-05-16 14:14:41

谢谢你。你的主意真的很好。我所需要的,特别是:

代码语言:javascript
复制
     Dictionnary<Tuple<string,string>,DateTime>

我想知道如何使所有这些数据都是相关的。

我只需要删除

代码语言:javascript
复制
     if (timeIntervalName != "s5")

因为“结果=结果+ timeIntervalName;”

每次调用GetArgumentName时都应该触发。

使……

代码语言:javascript
复制
    TimeSpan timeElapsed = now - lastUpdateDateTimes[dateTimeKey];

因为它在这种情况下甚至在()之间都不起作用。不知道为什么,它应该。(?)

我还需要填充我的lastUpdateDateTimes字典。(ofc)

所以,再次感谢你。像魅力一样工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23680678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档