編集(私の古いアプローチを一番下に移動しました)
あなたは私にあなたのコメントを手伝ってくれるように頼んだので、あなたが望むことをする別のアプローチがあります:
サンプルデータ(最初の4行が最新の要件です):
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",
"CM901K_Spare_parts_EN_rev.04-2",
"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);
foreach (var wr in withoutRev)
listBox1.Items.Add(wr);
foreach (var r in orderedWithRev)
listBox1.Items.Add(r);
デモは次のとおりです:http://ideone.com/fGFZ7
古い答え:
文字列が常に上記の形式である場合、最も簡単なのは、、、および:を使用Int32.Parse
することですString.Substring
。String.LastIndexof
Enumerable.Max
int highestNum = list.Where(s => s.Contains("."))
.Max(s => int.Parse(s.Substring(s.LastIndexOf(".")+1)));
または文字列を取得するには:
String highestNumString = list.Where(s => s.Contains("."))
.OrderByDescending(s => int.Parse(s.Substring(s.LastIndexOf(".")+1)))
.First();
編集:ここにデモがあります:http://ideone.com/0EeFg