【问题标题】:List to return values in intervals for a specific field列表以间隔返回特定字段的值
【发布时间】:2015-11-12 05:24:57
【问题描述】:

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

这些是列表的字段:

FieldName                DataType
Date                     DATETIME
DateString               STRING
Unit                     DOUBLE
Price                    DOUBLE

X轴标签值来自DateString字段

我实施的解决方案

  1. MIN 和 MAX Date DateString 字段将始终返回。
  2. 对于其余部分,返回工作日为“星期一”的值

这是代码-

// 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 Date DateString 字段将始终返回。 [和我现在做的一样]
  2. 无论列表项的总计数如何,从 MIN 和 MAX 日期开始以间隔返回 8 个值。
    2.a.但如果 List 计数小于或等于 8,则返回所有值。

因此,例如,如果在列表中我有 32 个值。它应该在 DateString 字段中返回我总共 10 个值,其余的将是空字符串。

【问题讨论】:

  • 如果没有示例数据说明失败的地方,很难提出解决方案

标签: c# list telerik


【解决方案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 和空集合检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多