不幸的是,我是Lambda / Linq的新手,我需要从列表中获取数据。以下是我现有的代码:
Highcharts chart = new Highcharts("chart")
.InitChart(new Chart { DefaultSeriesType = ChartTypes.Bubble, ZoomType = ZoomTypes.Xy, Width = 600, Height = 400 })
.SetTitle(new Title { Text = "Highcharts Bubbles" })
.SetSeries(new[]
{
new Series
{
Name="Buy",
Data = new Data(new object[]
{
new object[] {97,36,79 },
new object[] { 94,74,60 },
new object[] { 68,76,58 }
})
}
});
需要替换的代码行是:
new object[] {97,36,79 },
new object[] { 94,74,60 },
new object[] { 68,76,58 }
在{}内的上述代码中,而不是第一行中的硬编码值for example 97, 36, 79
,我需要传递交易中的值(交易量,价格和期限)。
(就像使用foreach循环一样,但我必须使用Lambda / Linq。)我可以查询list transaction中的所有事务。
我的poco课程是:
public class Transaction : SearchCondition, Automappable
{
[ScriptIgnore]
public virtual int Id { get; set; }
public virtual decimal Volume { get; set; }
public virtual decimal Price { get; set; }
public virtual DateTime TermDate { get; set; }
}
请帮我修改代码。
我非常感谢您的时间,指导和帮助。
修改 我尝试过以下解决方案中提到的方法,它几乎是所需要的,但仍然是一个小问题。
以下代码能够提供数据,但它们使用附加阵列覆盖数据。要清除它,请参阅下面错误结构的图像: 它没有显示错误,但因此我无法使用数据。
以下是正确的数据结构。
你能帮助多一点。
答案 0 :(得分:2)
如何生成这样的数组,其中transactionList是您的事务列表:
Data = new Data(transactionList
.Select(i => new object[]
{i.Volume, i.Price, i.TermDate} as object)
.ToArray();
在这里,您可以创建多个对象数组,每个数据对应一个事务记录。这些数组中的每一个都被视为最终数组中的单个对象。
通过将输入IEnumerable(在您的情况下为transactionList)的每个元素映射到元素的函数来选择工作。在您的情况下,您的函数(Select语句中的lambda表达式)接受每个元素,并将字段提取到对象数组中。
整个操作返回一个IEnumerable对象 - 但是你的Data构造函数接受一个对象数组。所以我们必须调用ToArray()来转换为对象[]。
答案 1 :(得分:2)
您是否尝试过使用上述解决方案之一但未选择阵列数组?
使用List<Transaction>
调用的交易:
Data = new Data(transactions.Select(t => t).ToArray());
这假设事务IEnumerable是Transaction对象的集合,在这种情况下,您只想选择数组中的每个对象并传递给Data类构造函数。
或者,您也可以这样做:
Data = new Data(transactions);
答案 2 :(得分:1)
我有一个名为tList的List<Transaction>
对象,那么您的数据行将如下所示:
Data = new Data(tList
// for each item in the list
.Select(
// create an array of the values we care about
item => new object[] { item.Volume, item.Price, item.TermDate })
// put each of those results into an array
.ToArray());
答案 3 :(得分:1)
如果您有IEnumerable
个对象,则可以使用Linq Select
方法将其转换为其他类型的IEnumerable
。
Select
语句将lambda表达式作为参数,该表达式从源IEnumerable
获取一个项并返回(通常)不同的类型。 lambda表达式的结果成为新IEnumerable
中的项目。
在您的情况下,我们假设您有一个名为List<Transaction>
的{{1}},其中包含您要在图表中显示的所有transactions
个对象。假设列表中的项目已按正确顺序排序,您可以使用以下代码创建Transaction
实例:
Data
在此代码中,Data = new Data(
transactions.Select(t =>
(object)new object[] { t.Volume, t.Price, t.TermDate}
)
.ToArray()
)
方法用于将Select
转换为List<Transaction>
,然后IEnumerable<object>
方法转换为ToArray
。
如果需要,可以对lambda表达式中的数据进行转换和计算:
object[]
(已编辑为返回Data = new Data(
transactions.Select(t =>
(object)new object[]
{
(int)t.Volume,
(int)t.Price,
t.TermDate.DayOfYear
}
)
.ToArray()
)
而不是object[]
)