1

我有一个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列出该事件在按 排序的列表中出现在它们之后时取消的所有事件类型OccurredOnCancelledBy是相反的,也就是说,如果其中一个CancelledBy事件出现在它之后,则该事件被取消。

如何查询这些对象的列表,以便列表中其他项目取消的项目不会出现在结果中?

4

2 回答 2

2

非常简单,尽管您似乎在重复列出取消和取消的工作:

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 并在此声明事件之后发生(即存在一个或多个此类元素)。

编辑:功能等效的代码,语法更易读

这也可以在调用中使用第二个委托方法来完成,Exists以查找任何取消事件:

theList.RemoveAll(i =>
    theList.Exists(j =>
        j.ClaimEventClaimEventType.Cancels.Contains(i.ClaimEventClaimEventType) &&
        j.OccurredOn > i.OccurredOn));

资源

MSDN:List(Of T).RemoveAll 方法

于 2011-06-02T21:20:13.770 回答
1

如果我正确理解您的要求,我认为您可能想要这样做。它本质上是对序列进行迭代并构建一个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();
于 2011-06-03T01:49:43.720 回答