我的策略是將元素分組爲桶,你打算剔除,然後從列表中選擇1元素以保持...我已經做了一個例子,如何使用DateTimes和Ints列表但Pics將以完全相同的方式工作。
我的課時用於存儲各事先知情同意
class Pic
{
public DateTime when {get;set;}
public int val {get;set;}
}
,並在列表中的幾個項目的範例......
List<Pic> intTime = new List<Pic>();
intTime.Add(new Pic() { when = DateTime.Now, val = 0 });
intTime.Add(new Pic() { when = DateTime.Now.AddDays(-1), val = 1 });
intTime.Add(new Pic() { when = DateTime.Now.AddDays(-1.01), val = 2 });
intTime.Add(new Pic() { when = DateTime.Now.AddDays(-1.02), val = 3 });
intTime.Add(new Pic() { when = DateTime.Now.AddDays(-2), val = 4 });
intTime.Add(new Pic() { when = DateTime.Now.AddDays(-2.1), val = 5 });
intTime.Add(new Pic() { when = DateTime.Now.AddDays(-2.2), val = 6 });
intTime.Add(new Pic() { when = DateTime.Now.AddDays(-3), val = 7 });
現在我創建一個輔助函數來桶和刪除..
private static void KeepOnlyOneFor(List<Pic> intTime, Func<Pic, int> Grouping, DateTime ApplyBefore)
{
var groups = intTime.Where(a => a.when < ApplyBefore).OrderBy(a=>a.when).GroupBy(Grouping);
foreach (var r in groups)
{
var s = r.Where(a=> a != r.LastOrDefault());
intTime.RemoveAll(a => s.Contains(a));
}
}
這樣做可以讓您指定如何對對象進行分組並設置分組的年齡閾值。現在終於用...
這將刪除所有,但每天1張圖片爲大於2天的任何圖片:後1日齡
KeepOnlyOneFor(intTime, a => a.when.Day, DateTime.Now.AddDays(-2));
這將刪除所有,但1個畫面的每個小時:
我從我標記爲答案的答覆中得到了靈感。在每個新的傳入圖像中,我運行我的清理例程。每個隊列我已經指定了一個時間間隔,如果這個時間間隔已經到期,我從上面的最近的隊列中得到最年長的圖像,並且清理那些對於正在處理的隊列來說太舊的圖像。 – frankhommers