【问题标题】:How can I fill the IEnumerable class of skender.stock.indicators?如何填写 skender.stock.indicators 的 IEnumerable 类?
【发布时间】:2021-11-27 19:52:58
【问题描述】:

我有这个数据表:

index date open high low close volume
1 01/03/17 $212.61 $213.35 $211.52 $212.80 96,708,880
2 01/04/17 $213.16 $214.22 $213.15 $214.06 83,348,752
3 01/05/17 $213.77 $214.06 $213.02 $213.89 82,961,968

我正在尝试使用 Skender.stocks 库

https://daveskender.github.io/Stock.Indicators/guide/

页面中的示例只说:

IEnumerable 引号 = Mycustomfunction();

如何在函数中使用 DataTable 或强制转换以返回 IEnumerable<Quote>

【问题讨论】:

    标签: c# .net vb.net datatable ienumerable


    【解决方案1】:

    非常感谢David!!,如果其他人需要,c# 中的完整代码如下:

    填充数据表....

    using Skender.Stock.Indicators;
    
    
    
    
    void makedt ()
        {
            dt = new DataTable();
            dt.Clear();
            dt.Columns.Add("Date");
            dt.Columns.Add("Open");
            dt.Columns.Add("High");
            dt.Columns.Add("Low");
            dt.Columns.Add("Close");
            dt.Columns.Add("Volume");
    
            DataRow _ravi = dt.NewRow();
            _ravi["Date"] = DateTime.Now;
            _ravi["Open"] = "500";
            _ravi["High"] = "500";
            _ravi["Low"] = "500";
            _ravi["Close"] = "500";
            _ravi["Volume"] = "500";
            dt.Rows.Add(_ravi);
            //_ravi.Delete();
    
            _ravi = dt.NewRow();
            _ravi["Date"] = DateTime.Now;
            _ravi["Open"] = "600";
            _ravi["High"] = "600";
            _ravi["Low"] = "600";
            _ravi["Close"] = "600";
            _ravi["Volume"] = "600";
            dt.Rows.Add(_ravi);
            //_ravi.Delete();
    
            _ravi = dt.NewRow();
            _ravi["Date"] = DateTime.Now;
            _ravi["Open"] = "700";
            _ravi["High"] = "700";
            _ravi["Low"] = "700";
            _ravi["Close"] = "700";
            _ravi["Volume"] = "700";
            dt.Rows.Add(_ravi);
            //_ravi.Delete();
    
            _ravi = dt.NewRow();
            _ravi["Date"] = DateTime.Now;
            _ravi["Open"] = "800";
            _ravi["High"] = "800";
            _ravi["Low"] = "800";
            _ravi["Close"] = "800";
            _ravi["Volume"] = "800";
            dt.Rows.Add(_ravi);
            //_ravi.Delete();
    
            _ravi = dt.NewRow();
            _ravi["Date"] = DateTime.Now;
            _ravi["Open"] = "900";
            _ravi["High"] = "900";
            _ravi["Low"] = "900";
            _ravi["Close"] = "900";
            _ravi["Volume"] = "900";
            dt.Rows.Add(_ravi);
            //_ravi.Delete();
        }
    

    运行程序......

    void method()
        {
            
            List<Quote> _quotes = new List<Quote>();
            foreach (DataRow row in dt.Rows)
                _quotes.Add(new Quote()
                {
                    Date = Convert.ToDateTime(row["Date"]),
                    Open = Convert.ToDecimal(row["Open"]),
                    High = Convert.ToDecimal(row["High"]),
                    Low = Convert.ToDecimal(row["Low"]),
                    Close = Convert.ToDecimal(row["Close"]),
                    Volume = Convert.ToDecimal(row["Volume"])
                });
    
            string s = "";
            foreach (var quote in _quotes)
            {
                s = s + quote.Date.ToString() + quote.Open.ToString() + quote.High.ToString() + quote.Low.ToString() + quote.Close.ToString();
            } // this for if only for check values
    
            IEnumerable<Quote> quotes = _quotes;
            IEnumerable<SmaResult> results = quotes.GetSma(2);
    
    
        }
    

    【讨论】:

    • 此答案涉及的错误编码实践
    • @Chestera 指出您认为错误的地方可能会更有帮助。
    • 在 Stack Overflow 上感谢某人的最佳方式是通过单击答案左侧的复选标记(勾号)来接受他们的答案。这将为大卫赢得一些积分,帮助未来的读者,甚至给你 2 分。
    • @Mary ops,我正在排队查看这个答案,但我没有注意到它会在这里发布。好的,我的意思是在不好的做法中,这个答案中有很多代码重复,需要一些重构
    【解决方案2】:

    一种选择是派生您自己的 Quote 类并添加一个构造函数,该构造函数从 DataRow 获取其属性值

    private class MyQuote : Quote
    {
        public MyQuote(DataRow dr)
        {
            this.Date = (DateTime)dr["date"];
            this.Open = (decimal)dr["open"];
            this.High = (decimal)dr["high"];
            this.Low = (decimal)dr["low"];
            this.Close = (decimal)dr["close"];
            this.Volume = (decimal)dr["volume"];
        }
    }
    

    或实现接口

    private class MyQuote : IQuote
    {
        public DateTime Date { get; set; }
        public decimal Open { get; set; }
        public decimal High { get; set; }
        public decimal Low { get; set; }
        public decimal Close { get; set; }
        public decimal Volume { get; set; }
        public MyQuote(DataRow dr)
        {
            this.Date = (DateTime)dr["date"];
            this.Open = (decimal)dr["open"];
            this.High = (decimal)dr["high"];
            this.Low = (decimal)dr["low"];
            this.Close = (decimal)dr["close"];
            this.Volume = (decimal)dr["volume"];
        }
    }
    

    然后您可以使用一些 LINQ 从 DataTable 中获取它(派生类和接口相同)

    var quotes = dt.Select().Select(r => new MyQuote(r));
    

    【讨论】:

    【解决方案3】:

    您需要:

    1. 遍历 DataTable 行
    2. 创建引用的新实例
    3. 将行中的值输入到相应的属性中
    4. 将报价添加到List(Of Quote)

    从那时起,该列表将是您的 IEnumerable。

    这是一个例子:

    Dim quotes As New List(Of Quote)()
    For Each row As DataRow In MyDataTable.Rows
        quotes.Add(New Quote() With {
            .Date = Convert.ToDateTime(row.Item("Date")),
            .Open = Convert.ToDecimal(row.Item("Open")),
            .High = Convert.ToDecimal(row.Item("High")),
            .Low = Convert.ToDecimal(row.Item("Low")),
            .Close = Convert.ToDecimal(row.Item("Close")),
            .Volume = Convert.ToDecimal(row.Item("Volume"))
        })
    Next
    

    现场演示:https://dotnetfiddle.net/LgguWG

    如果您知道每一行对每一列都有一个值,并且每一列都可以转换为其各自的数据类型,那么这是一种快速而肮脏的方法。

    如果您想进一步完善它,您可以设置条件语句来尝试在设置要添加到集合中的 Quote 的属性之前转换值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-27
      • 2013-07-07
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      相关资源
      最近更新 更多