c# - 通过条件循环使用 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。
解决方案
你需要SelectMany
和Enumerable.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
推荐阅读
- java - 在java中返回一个HashMap
- azure-ad-b2c - 访问令牌 - 生成授权码
- java - 在 Java 中使用一个 for 循环创建多个数组
- .net - 根据其类型 EF 核心获取相关对象
- javascript - 如何检查项目是否是循环内满足特定条件的最后一个元素
- python - 错误无法将字符串转换为浮点数:''
- objective-c - Swift 模块 React Native 上的奇怪问题 'Cannot find type 'RCTResponseSenderBlock' in scope'
- java - 在引用的 Java 源文件发生更改后,Javac 不会重新编译引用的类
- .net - PowerShell:如何可靠地发送电子邮件
- groovy - 无法在 Jenkinsfile 中正确地在函数上传递地图