关于作业: 有脚轮(巫婆(0)/仙女(1)),他们有法术能量(int)。我将它们存储在一个列表中。
我要找到两种类型中最好的。 (可以有多个具有相同法术强度的脚轮) 我想出了这个代码,但是有一个问题。如果具有最大法术能量的施法者是1,那么第一个FindAll将不会返回任何东西,因为它试图找到类型为0且具有最大法术能量的施法者。如果具有最大法术强度的施法者是类型1,我怎样才能获得包含类型0施法者能力最强的施法者?
private List<Caster> BestCasters()
{
List<Caster> temp = new List<Caster>();
temp = casters.FindAll(x => x.SpellPower == casters.Max(y => y.SpellPower) && (x.TypeOfCaster == 0));
temp.AddRange(casters.FindAll(x => x.SpellPower == casters.Max(y => y.SpellPower) && (x.TypeOfCaster == 1)));
temp.OrderBy(x => x.TypeOfCaster).ThenBy(y => y.CasterName);
return temp;
}
答案 0 :(得分:3)
LINQ GroupBy
行为非常适用于此:
var strongest_casters = casters.GroupBy(c => c.TypeOfCaster)
.Select(grp => grp.OrderByDescending(x => x.SpellPower)
.First()
);
或者返回每种类型的多个:
var strongest_casters = casters.GroupBy(c => c.TypeOfCaster)
.SelectMany(grp => grp.Where(y.SpellPower == grp.Max(x => x.SpellPower))
);
答案 1 :(得分:2)
private List<Caster> BestCasters()
{
var witches = casters.Where(x => x.TypeOfCaster == 0).ToList();
var fairies = casters.Where(x => x.TypeOfCaster == 1).ToList();
int witchesMax = witches.Max(x => x.SpellPower);
int fairiesMax = fairies.Max(x => x.SpellPower);
var temp = witches.Where(x => x.SpellPower == witchesMax).ToList();
temp.AddRange(fairies.Where(x => x.SpellPower == fairiesMax));
return temp.OrderBy(x => x.TypeOfCaster).ThenBy(y => y.CasterName).ToList();
}
答案 2 :(得分:0)
如果必须像这样使用FindAll,则应在仅包含正确类型的脚轮的子集上调用Max。当然,首先拆分初始列表然后获取每种最强的施法者会更有意义。 既然你没有告诉你究竟要做什么,我只能希望你被允许分裂:-)