【问题标题】:How to get elements in list and get next item using LINQ in C#?如何在 C# 中使用 LINQ 获取列表中的元素并获取下一项?
【发布时间】:2020-02-13 10:10:20
【问题描述】:

在我的应用程序中,我有 version 列表,它是字符串。 Json 结果如下:

[
    "v2.9.0",
    "v2.10.0",
    "v2.11.0",
    "v2.12.0",
    "v2.13.0",
    "v2.14.0",
    "v2.15.0",
    "v2.16.0",
    "v2.1.0",
    "v2.2.0"
]

我正在实施升级版本功能。将 currentVersion 升级到 targetVersion。逻辑是例如:如果当前版本是 v2.9.0 它肯定应该升级到 2.10.0 (我们的集合中的技巧部分也有 2.1.0 )

我有一个想法来使用这种方法获取数据来获取最大和最小数字,但我不知道如何获取下一个数字的逻辑。

           var str =  ReadLine();
           var digitArray = str.Select(x => int.Parse(x.ToString())).ToList();
           var min = int.Parse(string.Concat<string>(digitArray.OrderBy(x => x).Select(x => 
           x.ToString())));
           var max = int.Parse(string.Concat<string>(digitArray.OrderByDescending(x => 
           x).Select(x => x.ToString())));

我的项目类属性:

    public string KubesprayCurrentVersion { get; set; }
    public string KubesprayTargetVersion { get; set; }

我正在获取版本列表的 kubespray 类属性:

   public string Version { get; set; }

获取版本列表:

    [HttpGet]
    public async Task<IActionResult> GetKubesprays()
    {
        var result = await _context.Kubesprays.Select(x => x.Version).ToListAsync();
        return Ok(result);
    }

我需要使用 kubespray 版本列表升级我的项目 kubeSprayTargetVersion。 为了节省我正在使用的方法:

        [HttpPost("createproject")]
        public async Task<IActionResult> CreateProject(ProjectForCreationDto 
         projectForCreationDto)
        {
            var name = projectForCreationDto.Name.ToLower().Trim();
            var currentVerison = projectForCreationDto.KubesprayCurrentVersion.Trim();
            var targetVersion = string.Copy(currentVerison);

            if (await _repo.ProjectExists(name))
                return BadRequest("Project name already exists");

            var projectToCreate = new Project { Name = name, KubesprayCurrentVersion = 
            currentVerison, KubesprayTargetVersion = targetVersion};

            await _repo.CreateProject(projectToCreate);

            return StatusCode(201);
        }

我实际上需要将 kubeSprayTargetVersion 升级到下一个(在我的情况下,它首先是未排序的列表,可能我需要排序)(目前它是相同的 current 和 目标)

类似于 当前 v2.9.0 => v2.10.0

提前致谢。

【问题讨论】:

  • 许多其他问题的重复...搜索自然排序

标签: c# linq asp.net-core


【解决方案1】:

使用版本时,为什么不使用Version 类?

  string[] data = new string[] {
    "v2.9.0", "v2.10.0", "v2.11.0", "v2.12.0", 
    "v2.13.0", "v2.14.0", "v2.15.0", "v2.16.0", 
    "v2.1.0", "v2.2.0"
  };

  string[] sorted = data
    .OrderBy(item => Version.Parse(Regex.Match(item, @"[0-9]+(?:\.[0-9]+)+").Value))
    .ToArray();

  Console.Write(string.Join(Environment.NewLine, sorted));

结果:

v2.1.0
v2.2.0
v2.9.0
v2.10.0
v2.11.0
v2.12.0
v2.13.0
v2.14.0
v2.15.0
v2.16.0

将数组排序后,您可以轻松找出邻居("v2.9.0" 后跟"v2.10.0" 等):

  string currentVersion = "v2.9.0";

  string nextVersion = sorted[Array.IndexOf(sorted, currentVersion) + 1];

【讨论】:

猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多