大家一起来code review,看看这个代码可以怎样优化

yahle 2019-07-07 10:18:47

https://github.com/dogvane/ctp_net_core/blob/master/netcore_ctp/Spider/%E6%9C%9F%E8%B4%A7%E6%95%B0%E6%8D%AE%E7%88%AC%E8%99%AB/%E6%8C%81%E4%BB%93/%E8%BD%AC%E6%8D%A2/%E5%A4%A7%E5%95%86%E6%89%80.cs



Interest GetInterest(string[] txt)
{
Interest ret = new Interest();
List<string> 成交量 = new List<string>();
List<string> 持买单量 = new List<string>();
List<string> 持卖单量 = new List<string>();

List<string> current = null;

foreach (var line in txt)
{
if (line.IndexOf("合约代码") > -1)
{
var 代码 = line.Regex(@"合约代码:\w*\d*").Replace("合约代码:", "");
var month = 代码.Regex(@"\d+"); // 这里的日期已经是4位数了
ret.品种 = 代码.Regex(@"[a-zA-Z]+");
ret.Code = 代码;
ret.交割月份 = int.Parse(month.Substring(2, 2));

var date = line.Regex("Date:.*").Replace("Date:", "");
ret.Date = int.Parse(date.Replace("-", ""));
ret.Id = $"{ret.Date}_{ret.Code}";
}

if (line.IndexOf("\t成交量") > -1)
{
// 后面的状态进入成交量处理流程中
current = 成交量;
}
if (line.IndexOf("\t持买单量") > -1)
{
// 后面的状态进入成交量处理流程中
current = 持买单量;
}
if (line.IndexOf("\t持卖单量") > -1)
{
// 后面的状态进入成交量处理流程中
current = 持卖单量;
}

if (line.IndexOf("总计") > -1)
{
current = null;
}

if (current != null)
current.Add(line.FixLineToCsv());
}

//Console.WriteLine("成交量" + JsonConvert.SerializeObject(成交量, Formatting.Indented));
//Console.WriteLine("持卖单量" + JsonConvert.SerializeObject(持卖单量, Formatting.Indented));
//Console.WriteLine("持买单量" + JsonConvert.SerializeObject(持买单量, Formatting.Indented));

ret.成交量 = new List<InterestItem>();
foreach (var line in 成交量.Skip(1))
{
var s = line.Split(",").Select(o => o.Trim()).ToArray();
var rank = int.Parse(s[0]);
var 成交量机构 = s[1];
if (!string.IsNullOrEmpty(成交量机构) && 成交量机构 != "-")
{
var 成交量量 = int.Parse(s[2]);
var 成交量变化 = int.Parse(s[3]);

ret.成交量.Add(new InterestItem
{
机构名称 = 成交量机构,
数量 = 成交量量,
变化 = 成交量变化,
排名 = rank
});
}
}

ret.空单 = new List<InterestItem>();
foreach (var line in 持卖单量.Skip(1))
{
var s = line.Split(",").Select(o => o.Trim()).ToArray();
var rank = int.Parse(s[0]);
var 成交量机构 = s[1];
if (!string.IsNullOrEmpty(成交量机构) && 成交量机构 != "-")
{
var 成交量量 = int.Parse(s[2]);
var 成交量变化 = int.Parse(s[3]);

ret.空单.Add(new InterestItem
{
机构名称 = 成交量机构,
数量 = 成交量量,
变化 = 成交量变化,
排名 = rank
});
}
}


ret.多单 = new List<InterestItem>();
foreach (var line in 持买单量.Skip(1))
{
var s = line.Split(",").Select(o => o.Trim()).ToArray();
var rank = int.Parse(s[0]);
var 成交量机构 = s[1];
if (!string.IsNullOrEmpty(成交量机构) && 成交量机构 != "-")
{
var 成交量量 = int.Parse(s[2]);
var 成交量变化 = int.Parse(s[3]);

ret.多单.Add(new InterestItem
{
机构名称 = 成交量机构,
数量 = 成交量量,
变化 = 成交量变化,
排名 = rank
});
}
}

return ret;
}



目前的情况,单一函数内,代码过长
看上去有很多重复的代码

大家一起来动动手看看如何优化.
...全文
153 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
XBodhi. 2019-07-08
  • 打赏
  • 举报
回复
不过一看应该是爬虫程序把 。
XBodhi. 2019-07-08
  • 打赏
  • 举报
回复
一看是中文名字,就没有新区在看下去了。哈
xinbada1985 2019-07-08
  • 打赏
  • 举报
回复
上边没有提取共同的必要!下面那个重复的list可以提取出一个取值的共通出来用!
xinbada1985 2019-07-08
  • 打赏
  • 举报
回复
Interest GetInterest(string[] txt)
        {
            Interest ret = new Interest();
            List<string> 成交量 = new List<string>();
            List<string> 持买单量 = new List<string>();
            List<string> 持卖单量 = new List<string>();
 
            List<string> current = null;
 
            foreach (var line in txt)
            {
                if (line.IndexOf("合约代码") > -1)
                {
                    var 代码 = line.Regex(@"合约代码:\w*\d*").Replace("合约代码:", "");
                    var month = 代码.Regex(@"\d+");   // 这里的日期已经是4位数了
                    ret.品种 = 代码.Regex(@"[a-zA-Z]+");
                    ret.Code = 代码;
                    ret.交割月份 = int.Parse(month.Substring(2, 2));
 
                    var date = line.Regex("Date:.*").Replace("Date:", "");
                    ret.Date = int.Parse(date.Replace("-", ""));
                    ret.Id = $"{ret.Date}_{ret.Code}";
                }
 
                if (line.IndexOf("\t成交量") > -1)
                {
                    // 后面的状态进入成交量处理流程中
                    current = 成交量;
                }
                if (line.IndexOf("\t持买单量") > -1)
                {
                    // 后面的状态进入成交量处理流程中
                    current = 持买单量;
                }
                if (line.IndexOf("\t持卖单量") > -1)
                {
                    // 后面的状态进入成交量处理流程中
                    current = 持卖单量;
                }
 
                if (line.IndexOf("总计") > -1)
                {
                    current = null;
                }
 
                if (current != null)
                    current.Add(line.FixLineToCsv());
            }
 
            //Console.WriteLine("成交量" + JsonConvert.SerializeObject(成交量, Formatting.Indented));
            //Console.WriteLine("持卖单量" + JsonConvert.SerializeObject(持卖单量, Formatting.Indented));
            //Console.WriteLine("持买单量" + JsonConvert.SerializeObject(持买单量, Formatting.Indented));
 
            ret.成交量 = GetRetValue(成交量);
            ret.空单 =  GetRetValue(持卖单量);
            ret.多单 =  GetRetValue(持买单量);
            return ret;
        }
Interest GetRetValue(List<string> list)
{
List<InterestItem> ret = new List<InterestItem>();
foreach (var line in list.Skip(1))
            {
                var s = line.Split(",").Select(o => o.Trim()).ToArray();
                var rank = int.Parse(s[0]);
                var 成交量机构 = s[1];
                if (!string.IsNullOrEmpty(成交量机构) && 成交量机构 != "-")
                {
                    var 成交量量 = int.Parse(s[2]);
                    var 成交量变化 = int.Parse(s[3]);
 
                    ret.Add(new InterestItem
                    {
                        机构名称 = 成交量机构,
                        数量 = 成交量量,
                        变化 = 成交量变化,
                        排名 = rank
                    });
                }
            }
return ret;
}

 大概就这个意思有错误自己调整一下
jyglint 2019-07-08
  • 打赏
  • 举报
回复
变量名全部改成中文,看着会顺眼很多. 对了,还有个易语言,关键词也是用中文的,应该更适合你

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧