从列表中获取数据以在代码中使用?

时间:2013-11-18 00:51:29

标签: c# .net linq c#-4.0 lambda

不幸的是,我是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; }
}

请帮我修改代码。

我非常感谢您的时间,指导和帮助。

修改 我尝试过以下解决方案中提到的方法,它几乎是所需要的,但仍然是一个小问题。

以下代码能够提供数据,但它们使用附加阵列覆盖数据。要清除它,请参阅下面错误结构enter image description here的图像: 它没有显示错误,但因此我无法使用数据。

以下是正确的数据结构。 enter image description here

你能帮助多一点。

4 个答案:

答案 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[]