列表以特定字段的间隔返回值

时间:2015-11-12 05:24:57

标签: c# list telerik

我正在使用庞大的数据实施Telerik Chart。图表x轴上的标签重叠。我已经解决了这个问题,但从长远来看它并不可靠。

这些是List列出的字段:

FieldName                DataType
Date                     DATETIME
DateString               STRING
Unit                     DOUBLE
Price                    DOUBLE

X轴标签值来自DateString字段

解决方案我已实施

  1. MIN和MAX日期DateString字段将始终返回。
  2. 其余的,请返回工作日星期一'
  3. 的值

    这是代码 -

    // Get min and max Date
    DateTime minDate = DateTime.Now;
    DateTime maxDate = DateTime.Now;
    if (dtGas.Rows.Count > 0)
    {
        minDate = Convert.ToDateTime(dtGas.Compute("MIN([Date])", ""));
        maxDate = Convert.ToDateTime(dtGas.Compute("MAX([Date])", ""));
    }
    // Group by 'Date' and 'DateString' | 'SUM' of Unit and 'Price'
    var qGas = from x in dtGas.AsEnumerable()
                group x by new
                {
                    Date  = x.Field<DateTime>("Date"),
                    DateString = x.Field<string>("DateString")
                } into egroup
                let isOne = egroup.Key.Date.DayOfWeek.ToString() == "Monday"
                select new
                {
                    Date = egroup.Key.Date,
                    DateString = minDate == egroup.Key.Date ?
                                                (
                                                    egroup.Key.DateString
                                                ) :
                                                (
                                                    maxDate == egroup.Key.Date ?
                                                    (
                                                        egroup.Key.DateString
                                                    ) :
                                                    ( 
                                                        (isOne) ?
                                                        (
                                                            egroup.Key.DateString
                                                        ) :
                                                        (" ")
                                                    )                                            
                                                ),
                    Unit = egroup.Sum(r => r.Field<double>("Unit")),
                    Price = egroup.Sum(r => r.Field<double>("Price")),
                };
    

    此解决方案有助于返回所有值,而不是其中一些值。因此避免重叠。但是随着数据的增长,即使这个解决方案也会失败。

    解决方案我需要实施

    我在思考但不知道如何实施的想法是 -

    1. MIN和MAX日期DateString字段将始终返回。 [与我现在正在做的事情相同]
    2. 以MIN和MAX日期为间隔返回8个值,与列表项的总计数无关 2.A.但如果List count小于或等于8,则返回所有值。
    3. 因此,例如,如果在List I中有32个值。它应该在DateString字段中返回总共10个值,其余的将是空字符串。

1 个答案:

答案 0 :(得分:1)

我建议这样的事情:

    public static IList<Stock> GetSome(this IList<Stock> input)
    {
        var result = new List<Stock>();
        if (input.Count < 8)
        {
            return input;
        }
        else
        {
            var i = 0;
            for (; i < input.Count; ++i)
            {
                if (i % 8 == 0)
                {
                    result.Add(input[i]);
                }
            }
            if (i % 8 != 0)
            {
                result.Add(input.Last());
            }
        }
        return result;
    }

如果股票没有按时间顺序排列,我会按日期调用.Sort()。

您可能希望在代码中添加null和空集合检查。