3

宿題について:キャスター(魔女(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;
    }
4

3 に答える 3

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))
                                          );
于 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 に答える