我是我的代码重构的头,因为它是一团糟。 但是因为我从昨天开始,我的脑袋就像一块石头 - “ -
#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 condition”为true,则更新“date variable”并返回true,否则返回false。
你可以猜到,这个开关盒或多或少有70条线。需要在整个开关柜上重新进行一次更改。丑陋吧?
我想摆脱这个switchcase并使其更易于维护。 我想将所有数据放在不同的列表中。 所以它看起来像:
List<String> collectionName;
List<DateTime> dateTime;
List<String> timeFrame;
并在DateTime集合上执行foreach,然后执行2次嵌套。 像这样的东西:
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
答案 0 :(得分:2)
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);
}
}
}
有2个词典:
lastUpdateDateTimes
存储每个货币对的日期时间和时间间隔。元组的第一个成员存储货币对(&#34; EUR / USD&#34;格式),第二个成员存储时间间隔名称(&#34; s5&#34;格式)。timeIntervals
保留您的时间间隔。它填充了类的静态构造函数。 Update
方法是替换switch语句和CanUpdate方法。
答案 1 :(得分:0)
谢谢你。你的想法非常好。 正是我需要的特别是:
Dictionnary<Tuple<string,string>,DateTime>
我想知道如何将所有这些数据关联起来。
我只需要删除
if (timeIntervalName != "s5")
,因为 “result = result + timeIntervalName;”
每次调用GetArgumentName时都应该触发。
需要制作
TimeSpan timeElapsed = now - lastUpdateDateTimes[dateTimeKey];
因为它甚至在()之间的条件下也不起作用。不知道为什么,它应该。(?)
我还需要填充lastUpdateDateTimes Dictionnary。 (OFC)
所以,再次感谢你。像魅力一样工作。