2014-02-19 46 views
0

我難倒..請幫助創造回報的項目..日期間且僅當之前的另一項目被刪除

所以,說我有創建和刪除日期時間的項目列表..

ITEM, CREATED, DELETED 
item 1, 1/1/1999, 1/14/2014 
item 2, 1/1/1999, 1/17/2014 
item 3, 1/15/2014, NULL 
item 4, 1/16/2014, NULL 

它很難解釋我是如此裸露的..

我需要的最終結果列表...所以...

項目3項取消1了..因爲在創建後第1項是刪除。 。 但項目4項,因爲2被刪除之前創建它不會抵消項目2 ..

所以,最終的結果應該與

第2項,第3項,項目的列表4

我現在有代碼如下

   int year = DateTime.Now.Year; 
       DateTime sdate = new DateTime(year, DateTime.Now.Month - 1, 1); 
       DateTime edate = new DateTime(year, DateTime.Now.Month, 1); 

       var qry = Emails.collection.Where(t => 
        t.deletedon.HasValue ? 
        t.deletedon.Value >= sdate : 
        t.createdon.Value < edate 
        ).ToArray() 

但這個代碼包括第1項.. 因此,除非包括開始日期之後刪除了未刪除的結束日期之前創建的所有物品..

但是,如果一個項目被刪除並創建一個新的,那麼,這其中包括..但我需要基本替換被刪除一個與所生成的一個,所以最終的結果數總計最大的電子郵件創建並積極一次..

Emails.Item[] created = Emails.collection.Where(t => t.createdon.Value >= sdate && t.createdon.Value < edate).ToArray(); 
Emails.Item[] deleted = Emails.collection.Where(t => t.deletedon.HasValue && (t.deletedon.Value >= sdate && t.deletedon.Value < edate)).ToArray(); 

Emails.Item[] exceptions = deleted.Where(t => created.FirstOrDefault(c => c.createdon.Value >= t.createdon.Value)).ToArray(); ??? 
+2

我認爲這是很容易直接修改集合/的值複製到另一個帶有幾分像的方法;不是試圖做一個LINQ那裏,因爲你在哪裏工作,你需要加入集合與其自身如何檢查的日期,你正在尋找匹配與集合中的所有其他項目。只要在正常的循環邏輯中處理就簡單多了。 –

+0

是的,我想我需要一個除了在我上面的linq ..我想在另一個列表中得到例外.. –

回答

0

與您的查詢的問題是,一個項目的取消,因爲你描述的那樣,取決於與其它項目相比,和你在哪裏只檢查每一個項目本身的條件。

假設我理解你的問題很好:

  • 你需要的所有非刪除的項目加上刪除,但不會取消那些列表。
  • 一個項目被視爲已取消,如果有將其刪除

如果是這樣的話之後創造了另一個項目,我會先檢索未刪除的項目刪除的文件分開。下一步將是利用過濾非刪除的創建日期刪除的項目。

做這樣將通過訂購創建日期非刪除的項目,並得到了最早的並用它來丟棄比早刪除日期全部已刪除項目的一種簡單方法。

最後一步:合併兩個列表。

+0

是的,這是在正確的方向..這基本上是我一直到來的結論..仍然很難得到例外列表..我會盡力瞭解你所描述的過程.. 從某種意義上說,你的最終描述聽起來不對.. 正確的方法似乎是,我需要得到第一個在另一個項目被刪除後創建的項目.. Humm有點混亂 –

0

這裏是一個醜陋,但工作版本..

   int year = DateTime.Now.Year; 
       DateTime sdate = new DateTime(year, DateTime.Now.Month - 1, 1); 
       DateTime edate = new DateTime(year, DateTime.Now.Month, 1); 

       Emails.Item[] created = Emails.collection.Where(t => t.createdon.HasValue && (t.createdon.Value >= sdate && t.createdon.Value < edate)).OrderByDescending(y => y.createdon).ToArray(); 
       List<Emails.Item> deleted = Emails.collection.Where(t => t.deletedon.HasValue && (t.deletedon.Value >= sdate && t.deletedon.Value < edate)).OrderByDescending(y => y.deletedon).ToList(); 
       List<Emails.Item> ex = new List<Emails.Item>(); 
       foreach (Emails.Item t in created) 
       { 
        Emails.Item d = deleted.FirstOrDefault(y => y.deletedon.Value >= t.createdon.Value); 
        if (d != null && t.createdon.Value <= d.deletedon.Value) 
        { 
         deleted.Remove(d); 
         ex.Add(t); 
        } 
       } 

       //System.Windows.MessageBox.Show(created.Count().ToString() + "/" + deleted.Count().ToString() + "/" + ex.Count().ToString()); 

       var qry = Emails.collection.Where(t => 
        t.deletedon.HasValue ? 
        t.deletedon.Value >= sdate : 
        t.createdon.Value < edate 
        ).Except(ex).ToArray() 
        .OrderBy(t => t.lastname).OrderBy(t => t.firstname).GroupBy(x => x.company, (key, group) => new { Company = key, Items = group }); 

任何人都知道的一種方式來凝聚這一切呢?

相關問題