Linq自联接和过滤



我有一个由以下类组成的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();

相关内容

  • 没有找到相关文章

最新更新