我有一个由以下类组成的List<ClaimEvent>
:
public class ClaimEvent
{
public ClaimEventType ClaimEventClaimEventType { get; set; }
public DateTime OccurredOn { get; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }
public string CreatedBy { get; set; }
public string ModifiedBy { get; set; }
}
"ClaimEventType"是这样的…
public class ClaimEventType
{
public ClaimEventType()
{
Cancels = new List<ClaimEventType>();
CancelledBy = new List<ClaimEventType>();
}
public int ClaimEventTypeId { get; set; }
public string ClaimEventTypeName { get; set; }
public List<ClaimEventType> Cancels { get; set; }
public List<ClaimEventType> CancelledBy { get; set; }
}
Cancels
列出了此事件在按OccurredOn
排序的列表中出现在它们之后时取消的所有事件类型。CancelledBy
是相反的,也就是说,如果CancelledBy
事件中的一个出现在事件之后,则该事件被取消。
如何查询这些对象的列表,以便列表中其他项目取消的项目不会出现在结果中?
非常简单,尽管您似乎在重复列出取消和取消的工作:
List<ClaimEvent> theList = new List<ClaimEvent>();
theList.RemoveAll(i => (from j in theList
where j.ClaimEventClaimEventType.Cancels.Contains(i.ClaimEventClaimEventType) &&
j.OccurredOn > i.OccurredOn
select j).Count() > 0);
如果集合中存在另一个ClaimEvent,该ClaimEvent取消了该元素类型的ClaimEvent并发生在此索赔事件之后(即,存在一个或多个此类元素的情况下),则从集合对象中删除所有元素。
EDIT:具有更可读语法的功能等效代码
这也可以在对Exists
的调用中使用第二个委托方法来找到任何取消事件:
theList.RemoveAll(i =>
theList.Exists(j =>
j.ClaimEventClaimEventType.Cancels.Contains(i.ClaimEventClaimEventType) &&
j.OccurredOn > i.OccurredOn));
资源
MSDN:列表(T).RemoveAll方法
如果我正确理解您的需求,我认为您可能想要这样的东西。它本质上对序列进行迭代,并构建已经存在的事件类型的HashSet
。对于序列中的每个ClaimEvent
,它会检查先前存在的事件类型,以查找当前对象的取消类型之一。如果找不到,则可以生成当前对象并将其类型添加到集合中。
public static IEnumerable<ClaimEvent> GetUncancelledEvents(this IEnumerable<ClaimEvent> source)
{
// note: override Equals & GetHashCode in ClaimEventType**
HashSet<ClaimEventType> existingEventTypes = new HashSet<ClaimEventType>();
foreach (var @event in source)
{
bool isCancelled = false;
foreach (var cancellingEvent in @event.ClaimEventClaimEventType.CancelledBy)
{
if (existingEventTypes.Contains(cancellingEvent))
{
isCancelled = true;
break;
}
}
if (!isCancelled)
{
existingEventTypes.Add(@event.ClaimEventClaimEventType);
yield return @event;
}
}
}
var uncancelledEvents = eventsList.GetUncancelledEvents();