C# 将循环逻辑转换为LINQ
有人知道有没有更干净的方法(也许是LINQ)?我想将该值分组到bucket中,并给它一个分数,例如,在下面的代码中,如果该值为:C# 将循环逻辑转换为LINQ,c#,linq,c#-4.0,C#,Linq,C# 4.0,有人知道有没有更干净的方法(也许是LINQ)?我想将该值分组到bucket中,并给它一个分数,例如,在下面的代码中,如果该值为: 小于或等于5,将分数增加1 10及以下,增加2分 15及以下,增加3分 其他增加4 有大约10个属性,我必须这样做,每个属性有不同的评分范围 public static PScore GetScore(IEnumerable<PStat> rs) { var data = new PScore(); forea
- 小于或等于5,将分数增加1
- 10及以下,增加2分
- 15及以下,增加3分
- 其他增加4
public static PScore GetScore(IEnumerable<PStat> rs)
{
var data = new PScore();
foreach(var item in rs)
{
if(item.Kill <= 5)
{
data.Kills++;
}
else if (item.Kill <= 10)
{
data.Kills += 2;
}
else if (item.Kill <= 15)
{
data.Kills += 3;
}
else
{
data.Kills += 4;
}
}
return data;
}
公共静态PScore GetScore(IEnumerable rs)
{
var data=new PScore();
foreach(rs中的var项目)
{
如果(item.Kill我会使用LINQ对每个属性进行一些计算:
public static PScore GetScore(IEnumerable<PStat> rs)
{
var data = new PScore();
data.Kills = rs.Sum(item => Math.Min(item.Kill / 5 + (item.Kill % 5 == 0 ? 0 : 1), 4));
return data;
}
公共静态PScore GetScore(IEnumerable rs)
{
var data=new PScore();
data.Kill=rs.Sum(item=>Math.Min(item.Kill/5+(item.Kill%5==0?0:1),4));
返回数据;
}
我会使用LINQ对每个属性进行计算:
public static PScore GetScore(IEnumerable<PStat> rs)
{
var data = new PScore();
data.Kills = rs.Sum(item => Math.Min(item.Kill / 5 + (item.Kill % 5 == 0 ? 0 : 1), 4));
return data;
}
公共静态PScore GetScore(IEnumerable rs)
{
var data=new PScore();
data.Kill=rs.Sum(item=>Math.Min(item.Kill/5+(item.Kill%5==0?0:1),4));
返回数据;
}
通过使用选择从rs
中获取Kill
值,然后使用求和
对其进行聚合,可以减少重复次数
public static PScore GetScore(IEnumerable<PStat> rs)
{
return new PScore
{
Kills = rs.Select(item => item.Kill).Sum(kill =>
{
if (kill <= 5) return 1;
if (kill <= 10) return 2;
if (kill <= 15) return 3;
return 4;
})
};
}
公共静态PScore GetScore(IEnumerable rs)
{
返回新PScore
{
Kills=rs.Select(item=>item.Kill).Sum(Kill=>
{
如果(kill您可以通过使用选择从rs
中获取kill
值,然后使用求和对其进行聚合,从而减少重复次数
public static PScore GetScore(IEnumerable<PStat> rs)
{
return new PScore
{
Kills = rs.Select(item => item.Kill).Sum(kill =>
{
if (kill <= 5) return 1;
if (kill <= 10) return 2;
if (kill <= 15) return 3;
return 4;
})
};
}
公共静态PScore GetScore(IEnumerable rs)
{
返回新PScore
{
Kills=rs.Select(item=>item.Kill).Sum(Kill=>
{
如果(kill,我认为答案是否定的。去掉多余的大括号以获得屏幕空间,我认为这段代码很好。我认为答案是否定的。去掉多余的大括号以获得屏幕空间,我认为这段代码很好。这是一个非常专业的数学技巧,a)不可理解,b)对他的需求来说太具体了。他有一个不同的计划用于不同的目的。事实上,从这个回答中我意识到这个问题纯粹是基于意见的,我只是投票决定结束。这也是不正确的。当item.Kill
是5
时,它添加了5/5+1
,这是2
。它应该添加1
。我已经更正了我的公式,但这在这里不太重要-它不是非常专业的数学技巧,只是数学。它允许轻松地将分组值(5)和最大分数(4)更改为任何其他值,而无需重写许多行if
s。因此它可以重用(提供了这两个参数)对于其他属性,这是一个非常特殊的数学技巧,a)不可理解,b)对他的需求来说太具体了。他有一个不同的计划用于不同的目的。事实上,从这个回答中我意识到这个问题纯粹是基于意见的,我只是投票决定结束。这也是不正确的。当item.Kill
是5
时,它添加了5/5+1
,这是2
。它应该添加1
。我已经更正了我的公式,但这在这里不太重要-它不是非常专业的数学技巧,只是数学。它允许轻松地将分组值(5)和最大分数(4)更改为任何其他值,而无需重写许多行if
s。因此它可以重用(提供了这两个参数)对于其他属性,很好。你把所有的<代码>别号>代码>关键字。在对象初始化器中,你使用分号<代码>;< /代码>属性分配。我认为这必须是逗号>代码> <代码>。可以考虑使用命名方法而不是lambda,如<代码>。 .jjpPurnistelsBueld:代码。谢谢。你把所有的<代码>别号>代码>关键字。在对象初始化器中,你使用分号<代码>;< /代码>属性分配。我认为这必须是逗号>代码> <代码>。可以考虑使用命名方法而不是lambda,如<代码>(GetKillScore)
@JeppeStigNielsen浏览器代码::)感谢您的关注。