事实上,我是代码中的头领,因为这是个烂摊子。但从昨天开始,我的头看上去就像一块石头--“
#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。
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 =>对象)
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条线路。一个更改需要在整个开关箱上保存。很丑对吧?
我想摆脱这个开关箱,使它更易于维护。我想过把所有的数据都放在不同的列表中。所以看起来是:
List<String> collectionName;
List<DateTime> dateTime;
List<String> timeFrame;然后对DateTime集合做一个预测,然后执行2嵌套for。有些像:
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
发布于 2014-05-15 15:43:49
前言
GetInsertDataArgument()方法)。代码
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);
}
}
}发生什么事了
有两本字典:
lastUpdateDateTimes存储每个货币对和时间间隔的日期时间。元组的第一个成员存储货币对(以“EUR/美元”格式),第二个成员存储时间间隔名称(以"s5“格式)。timeIntervals保存您的时间间隔。它被填充在类的静态构造函数中。Update方法是对开关语句和CanUpdate方法的替代。
发布于 2014-05-16 14:14:41
谢谢你。你的主意真的很好。我所需要的,特别是:
Dictionnary<Tuple<string,string>,DateTime>我想知道如何使所有这些数据都是相关的。
我只需要删除
if (timeIntervalName != "s5")因为“结果=结果+ timeIntervalName;”
每次调用GetArgumentName时都应该触发。
使……
TimeSpan timeElapsed = now - lastUpdateDateTimes[dateTimeKey];因为它在这种情况下甚至在()之间都不起作用。不知道为什么,它应该。(?)
我还需要填充我的lastUpdateDateTimes字典。(ofc)
所以,再次感谢你。像魅力一样工作。
https://stackoverflow.com/questions/23680678
复制相似问题