2010-05-19 36 views
2

我有一個包含日期和計數的對象。如何從列表中填充缺失值

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

我有持有放入系統統計的列表,以及更多的一些信息,如姓名等意甲對象...

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
2010年5月3日3

乙級:
01.05.2010 5
2010年5月2日6

我應該得到:

意甲A:
01.05.2010 1
2010年5月2日0
2010年5月3日3

乙級:
01.05.2010 5
2010年5月2日6
2010年5月3日0

回答

1

不知道這對你是否足夠優雅;-)但是因爲我喜歡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 -instances序列與他們的Data填充默認值。

沒有什麼魔力。只是Linq的甜頭......(和無效的合併操作符!)

我還沒有試過這種負載和負載的數據,所以你的milage可能會有所不同。

+0

我結束了一個類似的解決方案。我其實不太確定linq在這裏真的有用。它使它更簡潔一點,但它理解那個方法鏈正在做什麼很容易。無論如何,謝謝你的答案! – 2010-05-24 12:55:58

+0

我完全同意你的關注。我認爲優雅可能不是在執行「均衡」方法,而是在使用中。如何分享你最終與什麼? – 2010-05-24 15:56:14