Скажите ваш класс ProgramEntry
:
public class ProgramEntry {
public long Id;
public string Name;
public long VM;
public long Vm;
public ProgramEntry (long id, string name, long vM, long vm) {
Id = id;
Name = name;
VM = vM;
Vm = vm;
}
public override string ToString() {
return this.Id+":"+this.Name+"("+this.VM+"."+this.Vm+")";
}
}
(да, используя открытые поля не является хорошей практикой, но это просто быстрый и грязный решение)
Теперь вы можете заказать их по версии (первый крупный, то незначительные):
List<ProgramEntry> programs = new List<ProgramEntry>();
//fill list with programs
var order = programs.OrderBy(x => -x.VM).ThenBy(x => -x.Vm);
В результате получается IEnumerable<ProgramEntry>
, заказанный с наибольшим крупным первым, а в случае эквивалентного крупного, самого большого второстепенного.
Далее вы можете использовать this duplicate filter, чтобы отфильтровать элементы с тем же Name
:
List<ProgramEntry> result = order.DistinctBy(x => x.Name).ToList();
DistinctBy
, кстати, часть MoreLINQ библиотеки. Или вы можете реализовать его самостоятельно, используя класс расширения:
public static class Foo {
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) {
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source) {
if (seenKeys.Add(keySelector(element))) {
yield return element;
}
}
}
}
Demo (с использованием csharp
интерактивной оболочки):
$ csharp
Mono C# Shell, type "help;" for help
Enter statements below.
csharp> public class ProgramEntry {
>
> public long Id;
> public string Name;
> public long VM;
> public long Vm;
>
> public ProgramEntry (long id, string name, long vM, long vm) {
> Id = id;
> Name = name;
> VM = vM;
> Vm = vm;
> }
>
> public override string ToString() {
> return this.Id+":"+this.Name+"("+this.VM+"."+this.Vm+")";
> }
>
> }
csharp> List<ProgramEntry> programs = new List<ProgramEntry>();
csharp> programs.Add(new ProgramEntry(1,"ssim",2,1));
csharp> programs.Add(new ProgramEntry(2,"ssim",3,1));
csharp> programs.Add(new ProgramEntry(3,"Counter",5,1));
csharp> programs.Add(new ProgramEntry(4,"Counter",6,2));
csharp> programs.Add(new ProgramEntry(5,"Counter",6,5));
csharp> programs
{ 1:ssim(2.1), 2:ssim(3.1), 3:Counter(5.1), 4:Counter(6.2), 5:Counter(6.5) }
csharp> var order = programs.OrderBy(x => -x.VM).ThenBy(x => -x.Vm);
csharp> order
{ 5:Counter(6.5), 4:Counter(6.2), 3:Counter(5.1), 2:ssim(3.1), 1:ssim(2.1) }
csharp> List<ProgramEntry> result = order.DistinctBy(x => x.Name).ToList();
csharp> result
{ 5:Counter(6.5), 2:ssim(3.1) }
Является ли это ожидаемое поведение?
Если порядок вещей сохраниться? –
Также вы используете список или хеш-таблицу? Это не одно и то же, поэтому вам не нужно использовать оба тега. –
Из вашего примера окончательного списка похоже, что вы хотите сохранить имена на основе max VersionMajor и VersionMinor, а не удалять дубликаты. – Jure