【发布时间】:2014-02-19 18:48:49
【问题描述】:
假设我有一个包含创建和删除日期时间的项目列表:
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(); ???
【问题讨论】:
-
我认为使用类似方法将集合/复制值简单地修改为另一个更容易;而不是尝试在哪里进行 linq,因为对于您在哪里工作,您需要将其自身加入集合以检查您正在查看的日期如何与集合中的所有其他项目匹配。这更容易在正常的循环逻辑中处理。
-
是的,我想我在上面的 linq 中需要一个例外。我正在尝试在另一个列表中获取例外。
-
我猜你的问题源于没有物品的标识符!
标签: c# linq logical-operators