2

「collidedrects」の長方形のリストがあります。最大の面積を持つ長方形を関数_playership.Collide()に渡します。これまでのところ...

var item = collidedrects.Max(x => x.Height*x.Width);
_playership.Collide(collidedrects[item]);

私はmaxとC#の=>のことにも精通していません

4

2 に答える 2

5

Aggregate代わりにMax、最大の長方形を見つけるために使用できます。

var largestRect = collidedrects.Aggregate( (r1,r2) => 
    (r1.Height * r1.Width) > (r2.Height * r2.Width) ? r1 : r2);
_playership.Collide(largestRect);
于 2012-11-15T16:05:28.860 に答える
0

問題はMax、値を生成したアイテムではなく、比較した値を返すことです。MaxBy値を生成したアイテムを返す 関数を作成すると、問題なく機能します。

public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source,
    Func<TSource, TKey> selector, IComparer<TKey> comparer = null)
{
    comparer = comparer ?? Comparer<TKey>.Default;
    using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
    {
        if (!sourceIterator.MoveNext())
        {
            throw new InvalidOperationException("Sequence was empty");
        }
        TSource max = sourceIterator.Current;
        TKey maxKey = selector(max);
        while (sourceIterator.MoveNext())
        {
            TSource candidate = sourceIterator.Current;
            TKey candidateProjected = selector(candidate);
            if (comparer.Compare(candidateProjected, maxKey) > 0)
            {
                max = candidate;
                maxKey = candidateProjected;
            }
        }
        return max;
    }
}

それであなたはすることができます:

var item = collidedrects.MaxBy(x => x.Height*x.Width);
_playership.Collide(collidedrects[item]);
于 2012-11-15T16:25:09.500 に答える