简体   繁体   English

如何在 C# 中使用 LINQ 获取列表中的元素并获取下一项?

[英]How to get elements in list and get next item using LINQ in C#?

In my application I have version list which is string.在我的应用程序中,我有一个字符串版本列表。 Json result looks like: 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"
]

I am implementing upgrade version functionality.我正在实现升级版本功能。 Which is upgrading currentVersion to targetVersion.这是将 currentVersion 升级到 targetVersion。 Logic is for ex: if current version is v2.9.0 it should be definitely upgrade to 2.10.0 (trick part in our collection we have also 2.1.0 )逻辑是例如:如果当前版本是v2.9.0,它肯定应该升级到2.10.0 (我们收藏中的技巧部分我们也有2.1.0

I have an idea to get data using this approach to getting max and min numbers but how to get logic for next number I have no idea.我有一个想法,使用这种方法来获取最大和最小数字的数据,但如何获得下一个数字的逻辑我不知道。

           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())));

My project class properties:我的项目类属性:

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

My kubespray class properties which I am getting list of versions:我正在获取版本列表的 kubespray 类属性:

   public string Version { get; set; }

Getting list of version:获取版本列表:

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

I need upgrade my project kubeSprayTargetVersion using list of kubespray version.我需要使用 kubespray 版本列表升级我的项目kubeSprayTargetVersion For saving I am using approach:为了节省我使用的方法:

        [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);
        }

I need upgrade kubeSprayTargetVersion to next one actually (in my case it is unsorted list first of all may be I need sort) (currently it is same current and target )我实际上需要将kubeSprayTargetVersion升级到下一个(在我的情况下,它是未排序的列表,首先可能是我需要排序)(目前它是相同的currenttarget

Something like current v2.9.0 => v2.10.0类似于当前的v2.9.0 => v2.10.0

Thanks in advance.提前致谢。

When working with versions, why not use Version class?使用版本时,为什么不使用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));

Outcome:结果:

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

Having the array sorted , you can easily find out neighbours ( "v2.9.0" is followed by "v2.10.0" etc.):将数组排序后,您可以轻松找出邻居( "v2.9.0"后跟"v2.10.0"等):

  string currentVersion = "v2.9.0";

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM