public static List <AggregateFeedItem> FromFeedItems(IList <FeedItem> feedItems) { #region comments /* AC: While this works, it won't serve at the moment * LinkedList<FeedItem> feedItemsLinkedList = new LinkedList<FeedItem>(feedItems); * LinkedListNode<FeedItem> node = feedItemsLinkedList.First; * LinkedListNode<FeedItem> next; * bool isOnBuildEvent = false; * int lastAuthorId = 0; * IOsbideEvent lastEvent = new BuildEvent(); * while (node != null) * { * next = node.Next; * if (node.Value != null) * { * if (node.Value.Log.LogType.CompareTo(BuildEvent.Name) == 0) * { * BuildEvent build = node.Value.Event as BuildEvent; * if (build != null) * { * //is this an empty error build event? * if (build.CriticalErrorCount == 0) * { * //have we already seen one immediately before this one? If so, * //remove from the event chain. * if (isOnBuildEvent == true * && lastAuthorId == node.Value.Log.SenderId * && lastEvent.SolutionName.CompareTo(node.Value.Event.SolutionName) == 0 * ) * { * feedItemsLinkedList.Remove(node); * } * else * { * isOnBuildEvent = true; * } * } * } * } * else * { * isOnBuildEvent = false; * } * } * lastAuthorId = node.Value.Log.SenderId; * lastEvent = node.Value.Event; * node = next; * } * feedItems = feedItemsLinkedList.ToList(); * */ #endregion List <AggregateFeedItem> aggregateItems = new List <AggregateFeedItem>(); //prime the loop FeedItem previousItem = null; AggregateFeedItem currentAggregate = null; if (feedItems.Count > 0) { currentAggregate = new AggregateFeedItem(feedItems[0]); //AC: LogCommentEvents work a little differenty. Their comments come from the event to which they point // and not themselves. if (feedItems[0].Event.EventName == LogCommentEvent.Name) { currentAggregate.Comments = currentAggregate.Comments.Union((feedItems[0].Event as LogCommentEvent).SourceEventLog.Comments).ToList(); } aggregateItems.Add(currentAggregate); previousItem = feedItems[0]; } for (int i = 1; i < feedItems.Count; i++) { FeedItem item = feedItems[i]; if ( AcceptableAggregates.Contains(item.Event.EventName) == true && //Do we care about this type of event? previousItem.Log.SenderId == item.Log.SenderId && //Is the sender the same? previousItem.Event.EventName.CompareTo(item.Event.EventName) == 0 //is it of the same event type? ) { currentAggregate.Items.Add(item); currentAggregate.Comments = currentAggregate.Comments.Union(item.Comments).ToList(); currentAggregate.HelpfulMarks += item.HelpfulComments; } else { currentAggregate = new AggregateFeedItem(item); //AC: LogCommentEvents work a little differenty. Their comments come from the event to which they point // and not themselves. if (item.Event.EventName == LogCommentEvent.Name) { currentAggregate.Comments = currentAggregate.Comments.Union((item.Event as LogCommentEvent).SourceEventLog.Comments).ToList(); } aggregateItems.Add(currentAggregate); } previousItem = item; } return(aggregateItems); }