我有這個資料表:
| 指數 | 日期 | 打開 | 高的 | 低的 | 關閉 | 體積 |
|---|---|---|---|---|---|---|
| 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<Quote> 引號 = Mycustomfunction() ;
如何在函式中使用 DataTable 或強制轉換以回傳IEnumerable<Quote>?
uj5u.com熱心網友回復:
您將需要:
- 迭代 DataTable 行
- 創建報價的新實體
- 將行中的值輸入到相應的屬性中
- 將報價添加到
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 的屬性之前嘗試轉換這些值。
uj5u.com熱心網友回復:
一種選擇是派生您自己的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));
uj5u.com熱心網友回復:
非常非常感謝大衛!!,如果別人需要的話,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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/314916.html
