using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Collections.Generic;
namespace NetTest
{
class Test
{
class Item {
public int Id { get; set; }
public string Name { get; set; }
public override string ToString() {
return $"Id={Id} Name={Name}";
}
}
static void Main(string[] args) {
var schedules = new List<Item>{
new Item { Id=1, Name = "S" },
new Item { Id=2, Name = "P" },
new Item { Id=3, Name = "X" },
new Item { Id=4, Name = "X" },
new Item { Id=5, Name = "P" },
new Item { Id=6, Name = "P" },
new Item { Id=7, Name = "P" },
new Item { Id=8, Name = "S" }
};
IDictionary<string,int> count = new Dictionary<string,int>();
var groups = schedules
.Select((s, i) => new {
Item = s
, Index = i
})
.GroupBy(p => {
var name = p.Item.Name;
int current;
if (!count.TryGetValue(name, out current)) {
current = 0;
count.Add(name, current);
}
count[name] = current + 1;
return new { Name = name, Order = current - p.Index };
})
.Select(g => g.ToList())
.Where(g => g.Count > 1)
.ToList();
foreach (var g in groups) {
Console.WriteLine("-----");
foreach (var s in g) {
Console.WriteLine(s);
}
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uSU87CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwoKbmFtZXNwYWNlIE5ldFRlc3QKewoKICAgIGNsYXNzIFRlc3QKICAgIHsKICAgICAgICBjbGFzcyBJdGVtIHsKICAgICAgICAgICAgcHVibGljIGludCBJZCB7IGdldDsgc2V0OyB9CiAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CgkJCXB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJCJJZD17SWR9IE5hbWU9e05hbWV9IjsKCQkJfQoJCX0KICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgICAgdmFyIHNjaGVkdWxlcyA9IG5ldyBMaXN0PEl0ZW0+ewogICAgICAgICAgICAgICAgbmV3IEl0ZW0geyBJZD0xLCBOYW1lID0gIlMiIH0sCiAgICAgICAgICAgICAgICBuZXcgSXRlbSB7IElkPTIsIE5hbWUgPSAiUCIgfSwKICAgICAgICAgICAgICAgIG5ldyBJdGVtIHsgSWQ9MywgTmFtZSA9ICJYIiB9LAogICAgICAgICAgICAgICAgbmV3IEl0ZW0geyBJZD00LCBOYW1lID0gIlgiIH0sCiAgICAgICAgICAgICAgICBuZXcgSXRlbSB7IElkPTUsIE5hbWUgPSAiUCIgfSwKICAgICAgICAgICAgICAgIG5ldyBJdGVtIHsgSWQ9NiwgTmFtZSA9ICJQIiB9LAogICAgICAgICAgICAgICAgbmV3IEl0ZW0geyBJZD03LCBOYW1lID0gIlAiIH0sCiAgICAgICAgICAgICAgICBuZXcgSXRlbSB7IElkPTgsIE5hbWUgPSAiUyIgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBJRGljdGlvbmFyeTxzdHJpbmcsaW50PiBjb3VudCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZyxpbnQ+KCk7CiAgICAgICAgICAgIHZhciBncm91cHMgPSBzY2hlZHVsZXMKICAgICAgICAgICAgICAgIC5TZWxlY3QoKHMsIGkpID0+IG5ldyB7CiAgICAgICAgICAgICAgICAgICAgSXRlbSA9IHMKICAgICAgICAgICAgICAgICwgICBJbmRleCA9IGkKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuR3JvdXBCeShwID0+IHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IHAuSXRlbS5OYW1lOwogICAgICAgICAgICAgICAgICAgIGludCBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgIGlmICghY291bnQuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IGN1cnJlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBjb3VudC5BZGQobmFtZSwgY3VycmVudCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvdW50W25hbWVdID0gY3VycmVudCArIDE7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB7IE5hbWUgPSBuYW1lLCBPcmRlciA9IGN1cnJlbnQgLSBwLkluZGV4IH07CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLlNlbGVjdChnID0+IGcuVG9MaXN0KCkpCiAgICAgICAgICAgICAgICAuV2hlcmUoZyA9PiBnLkNvdW50ID4gMSkKICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKICAgICAgICAgICAgZm9yZWFjaCAodmFyIGcgaW4gZ3JvdXBzKSB7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiLS0tLS0iKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzIGluIGcpIHsKICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9Cgp9Cg==