代码之家  ›  专栏  ›  技术社区  ›  Stéphane

如何填充列表中缺少的值

  •  2
  • Stéphane  · 技术社区  · 15 年前

    我有一个包含日期和计数的对象。

     public class Stat
     {
        public DateTime Stamp {get; set;}
        public int Count {get; set ;}
     }
    

    我有一个serie对象,它包含一个thoses stat列表,以及一些更多的信息,比如名字等等…

    public class Serie
    {
        public string Name { get; set; }
        public List<Stat> Data { get; set; }
        ...
    }
    

    假设我有一个系列的列表,但是系列并不都包含相同的邮票。 我需要把丢失的邮票填上 全部的 具有默认值的序列。

    我想到了这样一种带有签名的扩展方法(如果找到了,请提供更好的名称:):

     public static IEnumerable<Serie> Equalize(this IEnumerable<ChartSerie> series, int defaultCount)
    

    this question 似乎处理相同的问题,但当直接查询数据库时。当然,我可以循环浏览日期并创建另一个列表。但有没有更优雅的方式来实现这一点呢?

    即。:

    意甲:
    01.05.2010 1
    03.05.2010 3

    Serie B:
    01.05.2010 5
    02.05.2010 6

    我应该得到:

    意甲:
    01.05.2010 1
    02.05.2010 0
    03.05.2010 3

    Serie B:
    01.05.2010 5
    02.05.2010 6
    03.05.2010 0

    1 回复  |  直到 15 年前
        1
  •  1
  •   Christoffer Lette    15 年前

    不确定这对您来说是否足够优雅;-)但是因为我喜欢Linq,所以我会这样做(使用您的命名方案):

    public static IEnumerable<Serie> Equalize(
        this IEnumerable<Serie> series,
        int defaultCount)
    {
        var allStamps = series
            .SelectMany(s => s.Data.Select(d => d.Stamp))
            .Distinct()
            .OrderBy(d => d)
            .ToList();
    
        return series.Select(serie => new Serie(
            serie.Name,
            allStamps.Select(d =>
                serie.Data.FirstOrDefault(stat => stat.Stamp == d)
                ??
                new Stat(d, defaultCount))
            ));
    }
    

    要编译此代码,类需要几个构造函数:

    public class Stat
    {
        public Stat() {}
    
        public Stat(DateTime stamp, int count)
        {
            Stamp = stamp;
            Count = count;
        }
    
        public DateTime Stamp { get; set; }
        public int Count { get; set; }
    }
    
    public class Serie
    {
        public Serie() {}
    
        public Serie(string name, IEnumerable<Stat> data)
        {
            Name = name;
            Data = new List<Stat>(data);
        }
    
        public string Name { get; set; }
        public List<Stat> Data { get; set; }
    }
    

    打电话时 series.Equalize(0) 上面的代码将保持原始实例的完整性,并返回一个新创建的序列 Serie -实例及其 Data 用默认值填充。

    没有什么神奇的。只是林肯的甜蜜…(和空合并运算符!)

    我还没有尝试过加载和加载数据,因此您的里程可能会有所不同。