【问题标题】:appropriate c# collection when doing calculations that look at consecutive values进行查看连续值的计算时适当的 c# 集合
【发布时间】:2013-07-19 21:43:12
【问题描述】:

我有这个列表示例,我想按顺序迭代列表并获取第一周的值低于提供的最小值(即 10),并且接下来的 2 周的值也低于最小值或接下来 2 周的值中至少有一个是负数。

例如周“201303”的值为 8,下周“201304”(-3) 为负数,因此无论“201305”(15) 是否高于最小值,结果都是“201303”。

如果 "201304" 的值为 3 则不匹配并返回 null。

        var weekList = new List<WeekData>() {
            new WeekData {PlanningWeek = "201301", Value = 15},       // 31-12-2013
            new WeekData {PlanningWeek = "201302", Value = 12},       // 07-01-2013
            new WeekData {PlanningWeek = "201303", Value = 8},        // 14-01-2013
            new WeekData {PlanningWeek = "201304", Value = -3},       // 21-01-2013
            new WeekData {PlanningWeek = "201305", Value = 15},       // 28-01-2013
            new WeekData {PlanningWeek = "201306", Value = 12},       // 04-02-2013
            new WeekData {PlanningWeek = "201307", Value = 13},       // 11-02-2013
            new WeekData {PlanningWeek = "201308", Value = 8},        // 18-02-2013
            new WeekData {PlanningWeek = "201309", Value = 15},       // 25-02-2013
            new WeekData {PlanningWeek = "201310", Value = 15},       // 04-03-2013
            new WeekData {PlanningWeek = "201311", Value = 15}        // 11-03-2013         
        };

    public class WeekData
    {
        public string PlanningWeek { get; set; }
        // GetStartDate() being another custom extension method, used later
        public DateTime? WeekStartDate { get { return PlanningWeek.GetStartDate(); }}
        public long Value { get; set; }
    }

这样做的合适集合是什么?排序列表?链表?列表 ?还是别的什么?

该列表预计最多包含 13 项。

如果有人有一个很好的例子来实现这一点,那也会很有帮助。

【问题讨论】:

  • 使用什么样的 List 或 Enumerable 并不重要。只需订购并遍历数据。使用 Take(在每个循环中使用下一个 N 个元素进行比较)和 Skip(前进到下一个开始元素)可能很有用。

标签: c# .net list collections linked-list


【解决方案1】:

鉴于您将拥有的项目数量如此之少,您无需借助基于哈希的结构来提高性能,并且可以满足于 List&lt;WeekData&gt;(正如您已经在做的那样)。

关于您的查询,使用普通的旧循环而不是 LINQ 可能更容易做到。这是一个例子:

WeekData firstBelow10 = null;
for (int i = 0; i < weekList.Count - 2; ++i)
if (weekList[i] < 10 && (
        weekList[i + 1] < 10 &&
        weekList[i + 2] < 10 ||
        weekList[i + 1] <  0 ||
        weekList[i + 2] <  0))
    firstBelow10 = weekList[i];

【讨论】:

  • 谢谢。如果集合中有更多数据,您有什么建议吗?
  • @Pricey:这取决于您的场景细节(例如集合的实际大小、需要对其运行多少查询以及其内容更改的频率)。如果集合大到足以导致性能问题,那么您可能是从数据库加载它;在这种情况下,最好的方法是维护两列的索引,并直接向 DBMS 发出查询。
猜你喜欢
  • 2022-01-18
  • 2011-03-19
  • 2017-05-15
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多