首页 > 解决方案 > 通过条件循环使用 LINQ 返回字符串列表

问题描述

我有一个名为Skill的类,我通过一个参数收到了它的列表,我需要通过 LINQ 创建一个包含一些规则的字符串列表。

我的课

public class Skill {
        public int id {get;set;}
        public int year {get;set;}
        public int xp {get;set;}
    }

虚拟数据:

var skills = new List<Skill>(){
            new Skill() { id=1, year = 9, xp = 95 } ,
            new Skill() { id=2, year = 5 } ,
        };

规则://年最多为 10 //xp 最多为 100

我必须创建的字符串列表是这样的:每年直到 10 加上 xp 直到 100(如果有)

    // '1-9-95'
    // '1-9-96'
    // '1-9-97'
    // '1-9-98'
    // '1-9-99'
    // '1-9-99'
    // '1-9-100'
    // '1-10-95'
    // '1-10-96'
    // '1-10-97'
    // '1-10-98'
    // '1-10-99'
    // '1-10-99'
    // '1-10-100'
    // '2-5'
    // '2-6'
    // '2-7'
    // '2-8'
    // '2-9'
    // '2-10'

我使用for语句得到它,但我想知道使用 LINQ。

标签: c#linq

解决方案


你需要SelectManyEnumerable.Range

int maxYear = 10, maxXp = 100;
List<string> resultList = skills
    .Where(skill => skill.year <= maxYear && skill.xp <= maxXp) // skip invalid
    .SelectMany(skill => Enumerable.Range(skill.year, maxYear - skill.year + 1)
        .SelectMany(y => Enumerable.Range(skill.xp, maxXp - skill.xp + 1)
            .Select(xp => $"{skill.id}-{y}-{xp}")))
    .ToList();

.NET 小提琴:https ://dotnetfiddle.net/c80wJs

我想我忽略了“(如果有)”,所以你只想列出 xp(如果有):

int maxYear = 10, maxXp = 100;
List<string> resultList = skills
    .Where(skill => skill.year <= maxYear && skill.xp <= maxXp) // skip invalid
    .SelectMany(skill => Enumerable.Range(skill.year, maxYear - skill.year + 1)
        .SelectMany(y => Enumerable.Range(skill.xp, skill.xp == 0 ? 1 : maxXp - skill.xp + 1)
            .Select(xp => skill.xp > 0 ? $"{skill.id}-{y}-{xp}" : $"{skill.id}-{y}")))
    .ToList();

.NET-fiddle(感谢 Rand Random):https ://dotnetfiddle.net/06BIqg


推荐阅读