Есть ли быстрый способ (с помощью Linq) фильтровать список по началу каждого номера версии в c #? - PullRequest
0 голосов
/ 21 октября 2019

У меня есть объект IEnumerable, в котором одним из свойств является информация о версии. Он содержит значения типа

1.0,1.1,2.0,2.1,2.2,3.0

Я хотел бы получить максимум для каждой версии, равный

1.1,2.2,3.0

Я могу сделать это с помощью цикла. Но есть ли более быстрый / чистый способ сделать то же самое с помощью Linq? Ниже приводится информация о классе:

 public class FileVersionDetail
    {

        public int? ReturnTypeId { get; set; }
        public string FileTemplateName { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime? EndDate { get; set; }
        public DateTime? EffectiveDate { get; set; }
        public string VersionNumber { get; set; }
    }

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Я бы использовал для этой цели класс System.Version , поскольку в нем уже есть хороший синтаксический анализатор версий и встроенная логика сравнения.

private IEnumerable<string> GetMaxVersions(IEnumerable<FileVersionDetail> files) 
{
    return files
      .Select(f=>new Version(f.VersionNumber))
      .GroupBy(f=>f.Major)
      .Select(f=>f.Max().ToString());
}
2 голосов
/ 21 октября 2019

добавление комментария Rotem в виде кода.

private IEnumerable<string> GetMaxVersions(IEnumerable<FileVersionDetail> files) 
{
        //1. Group the list by base/floor version numbers.
        var groupedByBaseVersion = files.Select(f => f.VersionNumber).GroupBy(f => f.Split('.')[0]);

        //2. Find the max in each group.
        return groupedByBaseVersion.Select(g => g.ToArray().Max());
}
...