我正在尝试使用多个值查询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; }
}
答案 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;
。
如果您确定自己有一个结果,请使用var
或Single
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
异常,但在没有匹配时则抛出异常。
通常FirstOrDefault
比SingleOrDefault
快,因为它会返回它找到的第一个匹配,而不是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