ConsoleApplication2.Indicatordata中需要显式强制转换

时间:2017-08-06 15:20:03

标签: c#

我正在尝试使用多个值查询List。我得到一个演员异常,我不明白为什么。我应该在“来自”查询中投射什么?

  

无法隐式转换类型   'System.Collections.Generic.IEnumerable'   到'ConsoleApplication2.Indicatordata'。存在显式转换   (你错过了演员吗?)

class Program
{
    public static List<Indicatordata> Indicator = new List<Indicatordata>();

     public static List<DTNBars> getDTNBars(string symbol, DateTime dt)
    {
        TextReader tr = new StreamReader(File.Open(@"C:\MarketData\" + symbol + ".txt", FileMode.Open));
        List<DTNBars> dtnbars = new List<DTNBars>();
        DTNBars b = null;
        CsvReader csvr = new CsvReader(tr);
        DateTime prevDateTime = DateTime.MinValue;
        while (csvr.Read())
        {
            b = new DTNBars();

            b.Date_Time = csvr.GetField<DateTime>(0);
            if (USMarketHours(b.Date_Time)){
                if (prevDateTime == DateTime.MinValue || prevDateTime.Date != b.Date_Time.Date)
                {
                    // new date.
                    b.isNewDay = true;
                    prevDateTime = b.Date_Time.Date;
                    Indicatordata yesterday = from   id in Indicator
                                              where id.Ticker == symbol
                                                &&   id.Date_Time.Date == prevDateTime
                                              select id;



                }
                if (b.Date_Time >= dt)
                {
                    b.Open = csvr.GetField<double>(1);
                    b.High = csvr.GetField<double>(2);
                    b.Low = csvr.GetField<double>(3);
                    b.Close = csvr.GetField<double>(4);
                    b.Ticker = symbol;

                    dtnbars.Add(b);
                }
            }
        }
        tr.Close();
        return dtnbars.OrderBy(x => x.Date_Time).ToList<DTNBars>();
    }  
}

// class specification.

class Indicatordata
{
    public string Ticker { get; set; }
    public DateTime Date_Time { get; set; }
    public double? Close { get; set; }
    public double? Range { get; set; }
    public double? DAILYCCI { get; set; }
    public double? MA9 { get; set; }
    public double? MA50 { get; set; }
    public int? dailyVolume { get; set; }
    public double? Open { get; set; }
    public double? High { get; set; }
    public double? Low { get; set; }
    public bool? HH7 { get; set; }
}

5 个答案:

答案 0 :(得分:2)

您正在使用LINQ过滤掉记录。 a = ['c', 'd', 'e', 'f'] b = ['x', 'z'] print (df1.index.intersection(a)) Index(['c', 'd', 'e'], dtype='object') print (df1.columns.intersection(b)) Index(['x'], dtype='object') df2 = df1.loc[df1.index.intersection(a),df1.columns.intersection(b)] print (df2) x c 3 d 4 e 5 会返回where。特别是在您的情况下IEnumarable

所以要么改为:

IEnumarable<Indicatordata>

或者只使用IEnumarable<Indicatordata> yesterday = from id in Indicator where id.Ticker == symbol && id.Date_Time.Date == prevDateTime select id;

如果您确定自己有一个结果,请使用varSingle

SingleOrDefault

或使用var yesterday = (from id in Indicator where id.Ticker == symbol && id.Date_Time.Date == prevDateTime select id).Single(); First获取序列中的第一个元素

答案 1 :(得分:2)

这个

Indicatordata yesterday = from id in Indicator
                          where id.Ticker == symbol
                           && id.Date_Time.Date == prevDateTime
                          select id;

不仅返回一个值,而且还返回IEnumerable,所以如果您只想要其中一个值,那么您可能会像以下一样:

Indicatordata yesterday = Indicator.Where(id => id.Ticker == symbol
                           && id.Date_Time.Date == prevDateTime)
                           .Select(id => id)
                           .Single();

或者它可能是First / SingleOrDefault / FirstOrDefault依赖于数据逻辑

答案 2 :(得分:2)

LINQ查询返回IEnumerable<Indicatordata>,因为编译器无法知道您的数据将根据您提供的条件返回单个实例。您的LINQ查询应该是:

Indicatordata yesterday = (from   id in Indicator
                           where  id.Ticker == symbol
                              &&  id.Date_Time.Date == prevDateTime
                           select id).FirstOrDefault();

它会返回你想要的东西。

答案 3 :(得分:1)

将其更改为:

Indicatordata yesterday = Indicator.FirstOrDefault(id => id.Ticker == symbol && id.Date_Time.Date == prevDateTime);  

你也可以使用它,但我个人不喜欢它:

Indicatordata yesterday = (from   id in Indicator
                           where  id.Ticker == symbol   && 
                                  id.Date_Time.Date == prevDateTime
                           select id).FirstOrDefault();   

修改

在大多数情况下,

FirstOrDefault是我通常在代码中使用的内容。 正如其他人建议使用Single一样,我想补充说,如果有多个匹配项,Single将抛出异常,如果找不到匹配项,它将抛出异常。 使用SingleOrDefault也会在找到超过匹配时抛出IllegalOperation异常,但在没有匹配时则抛出异常。

通常FirstOrDefaultSingleOrDefault快,因为它会返回它找到的第一个匹配,而不是SingleOrDefault,它会遍历整个集合以检查另一个匹配。
如果您认为有多个匹配问题,则应使用SingleOrDefault

答案 4 :(得分:1)

问题是,您的查询会返回collection的{​​{1}},并且您正在尝试将该值放入一个“指标数据”中。宾语。这就是问题所在。

您可以从查询中提取1个对象,也可以指定IndicatorData或更好地使用IEnumerable<IndicatorData>

通过以下方式从返回的集合中获取一个对象:

var

或接受退回的收藏品:

Indicatordata yesterday = (from id in Indicator
                           where id.Ticker == symbol
                           && id.Date_Time.Date == prevDateTime
                           select id).FirstOrDefault();
//be sure to do your null checks, result will be null if no match is found.

替代方案,请使用List<Indicatordata> yesterdayIndicators = (from id in Indicator where id.Ticker == symbol && id.Date_Time.Date == prevDateTime select id).ToList(); 关键字:

var