C# 如何使用lambda表达式选择项目
我正在从数据存储中选择数据 我能够使用下面的查询获取第一个数组C# 如何使用lambda表达式选择项目,c#,lambda,C#,Lambda,我正在从数据存储中选择数据 我能够使用下面的查询获取第一个数组[0]{IHSWCFService.servicerence1.Observation} var newData = data.Select(a => new IHSData { PriceSymbol = Convert.ToString(a.PriceId), PeriodData = Convert.ToDateTime(a.ObservationVector.Select(x => x.Period
[0]{IHSWCFService.servicerence1.Observation}
var newData = data.Select(a => new IHSData
{
PriceSymbol = Convert.ToString(a.PriceId),
PeriodData = Convert.ToDateTime(a.ObservationVector.Select(x => x.Period).FirstOrDefault()),
StatusID = Convert.ToInt32(a.ObservationVector.Select(x => x.StatusId).ToList()),
Price = Convert.ToDouble(a.ObservationVector.Select(x => x.price).FirstOrDefault()),
});
但我还想选择下一个数组。如下图屏幕截图所示
你能帮帮我吗。谢谢您可能希望
IHSData
中的所有属性都是列表:
var newData = data.Select(a => new IHSData
{
PriceSymbol = Convert.ToString(a.PriceId),
PeriodData = a.ObservationVector.Select(x => Convert.ToDateTime(x.Period)).ToList(),
StatusID = a.ObservationVector.Select(x => Convert.ToInt32(x.StatusId)).ToList(),
Price = a.ObservationVector.Select(x => Convert.ToDouble(x.price)).ToList(),
});
这不是一个好主意,因为你必须单独索引它们。因此,另一种选择是使用SelectMany
:
var newData = data
.SelectMany(a => a.ObservationVector.Select(v =>
new IHSData
{
PriceSymbol = Convert.ToString(a.PriceId), // parent PriceId
PeriodData = Convert.ToDateTime(v.Period),
StatusID = Convert.ToInt32(v.StatusId),
Price = Convert.ToDouble(v.price),
}))
.ToList();
后一种方法将为每个ObservationVector
创建一个单独的IHSData
实例,其中一些实例将共享父类的相同PriceId
或者,第三种方法是创建一个新类,即“解析版本的观测向量”
,即包含解析值的属性,类似于:
var newData = data.Select(a => new IHSData
{
PriceSymbol = Convert.ToString(a.PriceId),
Data = a.ObservationVector.Select(x => ConvertObservationVector(x)).ToList()
});
其中,
ConvertObservationVector
是一种将ObservationVector
转换为已解析类的方法。屏幕截图无法通过谷歌搜索或编译。无论如何,截图并不能解释任何事情。假设data
是一个IEnumerable,您已经编写了一个正确的Select语句。问题是什么?在PeriodData=Convert.ToDateTime(a.ObservationVector.Select(x=>x.Period).FirstOrDefault()中,我可以读取这些值。但我也想读取下一个值。[0]{IHSWCFService.ServiceReference1.Observation}[1]{IHSWCFService.ServiceReference1.Observation}我还想读取下一个值,因为每个IHSData
只包含一个PeriodData
,并且在data
列表中,您想从数据库中获取每个PeriodData
,这样将有多个IHSData
对象具有相同的PriceSymbol
但唯一的PeriodData
,那么Select
创建一个投影,该投影将应用于列表中的所有元素。如果添加.ToList()
在选择
方法之后,您将得到一个与输入列表长度相同的列表。感谢您的回复,我只是在检查。下面是错误信息,无法强制转换类型为“WhereSelectArrayInterator”的对象2[IHSWCFService.ServiceReference1.Observation,System.DateTime]“to type”System.IConvertible”和使用第二种方法很难在不发布实际类的代码的情况下判断。我不清楚为什么要使用Convert.ToDateTime
和Convert.ToUInt32
,因为工具提示似乎表明这些属性不是字符串,但已经具有正确的类型。这就是原因发布截图而不是实际代码是个坏主意。
var newData = data.Select(a => new IHSData
{
PriceSymbol = Convert.ToString(a.PriceId),
Data = a.ObservationVector.Select(x => ConvertObservationVector(x)).ToList()
});