using System;
using System.Linq;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
Action[] actions =
{
new Action(1, new DateTime(2013,3,22), 4, 8),
new Action(2, new DateTime(2013,3,31), 1, 8),
new Action(3, new DateTime(2013,4,12), 3, 8),
new Action(4, new DateTime(2013,3,22), 4, 9),
new Action(5, new DateTime(2013,3,31), 1, 9),
new Action(6, new DateTime(2013,4,12), 5, 9)
};
PrintResult(GetActions(actions, 4, 1));
PrintResult(GetActions(actions, 4, 5));
PrintResult(GetActions(actions, 3, 5));
}
public static void PrintResult(IEnumerable<int> result)
{
foreach(var item in result)
Console.WriteLine(item);
Console.WriteLine("---");
}
public static IEnumerable<int> GetActions(IEnumerable<Action> actions, params int[] actionTypes)
{
return actions.GroupBy(x => x.UserID)
.Select(g => g.OrderByDescending(x => x.ActionTime)
.First())
.Where(x => actionTypes.Contains(x.ActionType))
.Select(x => x.ActionID);
}
public class Action
{
public Action(int actionID, DateTime actionTime, int actionType, int userID)
{
ActionID = actionID;
ActionTime = actionTime;
ActionType = actionType;
UserID = userID;
}
public int ActionID { get; set; }
public DateTime ActionTime { get; set; }
public int ActionType { get; set; }
public int UserID { get; set; }
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJQWN0aW9uW10gYWN0aW9ucyA9CgkJeyAKCQkJbmV3IEFjdGlvbigxLCBuZXcgRGF0ZVRpbWUoMjAxMywzLDIyKSwgNCwgOCksCgkJCW5ldyBBY3Rpb24oMiwgbmV3IERhdGVUaW1lKDIwMTMsMywzMSksIDEsIDgpLAoJCQluZXcgQWN0aW9uKDMsIG5ldyBEYXRlVGltZSgyMDEzLDQsMTIpLCAzLCA4KSwKCQkJbmV3IEFjdGlvbig0LCBuZXcgRGF0ZVRpbWUoMjAxMywzLDIyKSwgNCwgOSksCgkJCW5ldyBBY3Rpb24oNSwgbmV3IERhdGVUaW1lKDIwMTMsMywzMSksIDEsIDkpLAoJCQluZXcgQWN0aW9uKDYsIG5ldyBEYXRlVGltZSgyMDEzLDQsMTIpLCA1LCA5KQoJCX07CgkJCgkJUHJpbnRSZXN1bHQoR2V0QWN0aW9ucyhhY3Rpb25zLCA0LCAxKSk7CgkJUHJpbnRSZXN1bHQoR2V0QWN0aW9ucyhhY3Rpb25zLCA0LCA1KSk7CgkJUHJpbnRSZXN1bHQoR2V0QWN0aW9ucyhhY3Rpb25zLCAzLCA1KSk7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBQcmludFJlc3VsdChJRW51bWVyYWJsZTxpbnQ+IHJlc3VsdCkKCXsKCQlmb3JlYWNoKHZhciBpdGVtIGluIHJlc3VsdCkKCQkJQ29uc29sZS5Xcml0ZUxpbmUoaXRlbSk7CgkJQ29uc29sZS5Xcml0ZUxpbmUoIi0tLSIpOwoJfQoJCglwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPGludD4gR2V0QWN0aW9ucyhJRW51bWVyYWJsZTxBY3Rpb24+IGFjdGlvbnMsIHBhcmFtcyBpbnRbXSBhY3Rpb25UeXBlcykKCXsKCQlyZXR1cm4gYWN0aW9ucy5Hcm91cEJ5KHggPT4geC5Vc2VySUQpCiAgICAJCQkgICAgICAuU2VsZWN0KGcgPT4gZy5PcmRlckJ5RGVzY2VuZGluZyh4ID0+IHguQWN0aW9uVGltZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0KCkpCiAgICAgICAgICAgICAgICAgICAgICAuV2hlcmUoeCA9PiBhY3Rpb25UeXBlcy5Db250YWlucyh4LkFjdGlvblR5cGUpKQogICAgICAgICAgICAgICAgICAgICAgLlNlbGVjdCh4ID0+IHguQWN0aW9uSUQpOwoJfQoJCglwdWJsaWMgY2xhc3MgQWN0aW9uCgl7CgkgICAgcHVibGljIEFjdGlvbihpbnQgYWN0aW9uSUQsIERhdGVUaW1lIGFjdGlvblRpbWUsIGludCBhY3Rpb25UeXBlLCBpbnQgdXNlcklEKQoJCXsKCQkgICAgQWN0aW9uSUQgPSBhY3Rpb25JRDsKCQkJQWN0aW9uVGltZSA9IGFjdGlvblRpbWU7CgkJCUFjdGlvblR5cGUgPSBhY3Rpb25UeXBlOwoJCQlVc2VySUQgPSB1c2VySUQ7CgkJfQoJCQoJCXB1YmxpYyBpbnQgQWN0aW9uSUQgeyBnZXQ7IHNldDsgfQoJCXB1YmxpYyBEYXRlVGltZSBBY3Rpb25UaW1lIHsgZ2V0OyBzZXQ7IH0KCQlwdWJsaWMgaW50IEFjdGlvblR5cGUgeyBnZXQ7IHNldDsgfQoJCXB1YmxpYyBpbnQgVXNlcklEIHsgZ2V0OyBzZXQ7IH0KCX0KfQ==