3

关于作业:有施法者(女巫(0)/仙女(1)),他们有法术(智力)。我将它们存储在一个列表中。

我要找到两种类型中最好的。(可以有多个具有相同法术强度的施法者)我想出了这个代码,但是有一个问题。如果法术强度最高的施法者是 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;
    }
4

3 回答 3

3

LINQGroupBy行为非常适合:

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))
                                          );
于 2013-03-08T22:54:47.697 回答
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();
}
于 2013-03-08T22:43:19.083 回答
0

如果您必须像这样使用 FindAll,您应该在仅包含正确类型的脚轮的子集上调用 Max。当然,首先拆分初始列表,然后获取每种最强的施法者会更有意义。既然你没有告诉你到底要做什么,我只能希望你被允许分裂:-)

于 2013-03-08T22:47:19.740 回答