using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
public static void Main()
{
var list = new List<String>(){
"CM901K_Spare_parts_EN_rev.04-2",
"CM901K_Spare_parts_EN_rev.04-1",
"CM901K_Spare_parts_EN_rev.04-3",
"rev.04-2",
"CM_Manual_EN_rev.01",
"CM_Manual_EN_rev.02",
"CM_Manual_EN_REV.05",
"CM_Manual_EN_REV.06",
"CM_Manual_EN_REV.07",
"CM12-CM6K_Spare_parts_DK_rev.01",
"CM12-CM6K_Spare_parts_DK_rev.03",
"BT_Dansk_Manual_NOM",
"CM_Svensk_Manual",
"CM901-CM30_Manual_RUS",
"D_Polsk_Manual",
"HPB_spansk_old"
};
var withRev = list.Where(s => s.IndexOf("rev.", StringComparison.OrdinalIgnoreCase) > -1);
var withoutRev = list.Except(withRev);
var orderedWithRev = withRev
.Select(r => {
int RevIndex = r.LastIndexOf("rev.", StringComparison.OrdinalIgnoreCase);
String[] tokens = r
.Substring(RevIndex + "rev.".Length)
.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
return new
{
Item = r,
RevIndex,
RevisionItem = r.Substring(0, RevIndex),
MainRevision = int.Parse(tokens[0]),
SubRevision = tokens.Length > 1 ? int.Parse(tokens[1]) : 0
};
})
.GroupBy(x => x.RevisionItem.ToLower())
.Select(g => g
.OrderByDescending(x => x.MainRevision)
.ThenByDescending( x => x.SubRevision)
.First().Item);
// demo
Console.Write(String.Join(Environment.NewLine, withoutRev.ToArray()));
Console.Write(String.Join(Environment.NewLine, orderedWithRev.ToArray()));
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJdmFyIGxpc3QgPSBuZXcgTGlzdDxTdHJpbmc+KCl7CiAgICAgICAgICAgICAgICAgICAgIkNNOTAxS19TcGFyZV9wYXJ0c19FTl9yZXYuMDQtMiIsIAogICAgICAgIAkgICAgIkNNOTAxS19TcGFyZV9wYXJ0c19FTl9yZXYuMDQtMSIsCiAgICAgICAgICAgICAgICAgICAgIkNNOTAxS19TcGFyZV9wYXJ0c19FTl9yZXYuMDQtMyIsCiAgICAgICAgICAgICAgICAgICAgInJldi4wNC0yIiwKCQkgICAgIkNNX01hbnVhbF9FTl9yZXYuMDEiLCAKCQkgICAgIkNNX01hbnVhbF9FTl9yZXYuMDIiLCAgCgkJICAgICJDTV9NYW51YWxfRU5fUkVWLjA1IiwgICAKCQkgICAgIkNNX01hbnVhbF9FTl9SRVYuMDYiLCAgIAoJCSAgICAiQ01fTWFudWFsX0VOX1JFVi4wNyIsICAgCgkJICAgICJDTTEyLUNNNktfU3BhcmVfcGFydHNfREtfcmV2LjAxIiwgICAgCgkJICAgICJDTTEyLUNNNktfU3BhcmVfcGFydHNfREtfcmV2LjAzIiwgICAKCQkgICAgIkJUX0RhbnNrX01hbnVhbF9OT00iLAoJCSAgICAiQ01fU3ZlbnNrX01hbnVhbCIsCgkJICAgICJDTTkwMS1DTTMwX01hbnVhbF9SVVMiLAoJCSAgICAiRF9Qb2xza19NYW51YWwiLAoJCSAgICAiSFBCX3NwYW5za19vbGQiCgkJIH07CgkJIHZhciB3aXRoUmV2ID0gbGlzdC5XaGVyZShzID0+IHMuSW5kZXhPZigicmV2LiIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpID4gLTEpOwogICAgICAgICAgICAJIHZhciB3aXRob3V0UmV2ID0gbGlzdC5FeGNlcHQod2l0aFJldik7CgkJIHZhciBvcmRlcmVkV2l0aFJldiA9IHdpdGhSZXYKCQkgICAgICAgIC5TZWxlY3QociA9PiB7IAoJCSAgICAgICAgICAgIGludCBSZXZJbmRleCA9IHIuTGFzdEluZGV4T2YoInJldi4iLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKTsKCQkgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSByCgkJICAgICAgICAgICAgICAgIC5TdWJzdHJpbmcoUmV2SW5kZXggKyAicmV2LiIuTGVuZ3RoKQoJCSAgICAgICAgICAgICAgICAuU3BsaXQobmV3W10geyAnLScgfSwgU3RyaW5nU3BsaXRPcHRpb25zLlJlbW92ZUVtcHR5RW50cmllcyk7CgkJICAgICAgICAgICAgcmV0dXJuIG5ldwoJCSAgICAgICAgICAgIHsKCQkgICAgICAgICAgICAgICAgSXRlbSA9IHIsCgkJICAgICAgICAgICAgICAgIFJldkluZGV4LAoJCSAgICAgICAgICAgICAgICBSZXZpc2lvbkl0ZW0gPSByLlN1YnN0cmluZygwLCBSZXZJbmRleCksCgkJICAgICAgICAgICAgICAgIE1haW5SZXZpc2lvbiA9IGludC5QYXJzZSh0b2tlbnNbMF0pLAoJCSAgICAgICAgICAgICAgICBTdWJSZXZpc2lvbiAgPSB0b2tlbnMuTGVuZ3RoID4gMSA/IGludC5QYXJzZSh0b2tlbnNbMV0pIDogMAoJCSAgICAgICAgICAgIH07CgkJICAgICAgICB9KQoJCSAgICAgICAgLkdyb3VwQnkoeCA9PiB4LlJldmlzaW9uSXRlbS5Ub0xvd2VyKCkpCgkJICAgICAgICAuU2VsZWN0KGcgPT4gZwoJCSAgICAgICAgICAgIC5PcmRlckJ5RGVzY2VuZGluZyh4ID0+IHguTWFpblJldmlzaW9uKQoJCSAgICAgICAgICAgIC5UaGVuQnlEZXNjZW5kaW5nKCB4ID0+IHguU3ViUmV2aXNpb24pCgkJICAgICAgICAgICAgLkZpcnN0KCkuSXRlbSk7CgoJCS8vIGRlbW8KICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoU3RyaW5nLkpvaW4oRW52aXJvbm1lbnQuTmV3TGluZSwgd2l0aG91dFJldi5Ub0FycmF5KCkpKTsKCQlDb25zb2xlLldyaXRlKFN0cmluZy5Kb2luKEVudmlyb25tZW50Lk5ld0xpbmUsIG9yZGVyZWRXaXRoUmV2LlRvQXJyYXkoKSkpOwoJfQp9