2

C#コレクションを操作するためのツールが提供されていることを発見しました。

要素のリストがあり、プロパティを最も満たすものを取得したいとします。基本的には、最高の要素elements.Max(predicate)のインデックスに興味があることを除いて。要素自体ではなくインデックスが必要な理由は、そのような要素がない可能性があり、型がnull許容でないためです。

これを行う関数を作成するのは簡単ですが、C#が提供するツールの表現力を使用して、簡潔で、明確で、最適なO(n))ソリューションを取得することに興味があります。

この時点で、次のコードがありますが、まだ雑然としているように見え、プロパティを2回評価します。

List<foo> elements;
private int getBest(object x)
{
  var indices = Enumerable.Range(0, elements.Count);
  return indices.Aggregate(-1, (best, next) =>
    (-1 == best || eval(x, elements[next]) > eval(x, elements[best])) ? next : best);
}

このコードを改善するにはどうすればよいですか?


補遺:わかりやすくするためにコードには入れませんでしたがeval()、特定のしきい値を下回ると、要素は破棄されます。

4

3 に答える 3

1

LINQを使用して実行するのは楽しいですが、LINQを使用せずに実行すると、より直感的になります。

int bestIndex = -1;
int bestResult = -1;
for(int i = 0; i < elements.Count; ++i)
{
    int currentResult = eval(x, elements[i]);
    if (currentResult > bestResult)
    {
        bestResult = currentResult;
        bestIndex = i;
    }
}
于 2012-05-24T08:06:50.690 に答える
1

LINQ 拡張メソッドSelectと組み合わせて使用​​することをお勧めします。Aggregateメソッドを使用して、コレクション内の各アイテムのとSelectを格納する匿名型を作成できます。次に、LINQメソッドを使用して、最大の値を持つアイテムを絞り込むことができます。このようなものはうまくいくはずです:indexvalueAggregate

private int GetIndexOfHighestValue(IEnumerable<int> list)
{
    return list.Select((i, v) => new { Index = i, Value = v })
        .Aggregate((a, b) => (a.Value > b.Value) ? a : b)
        .Index;
}
于 2012-05-24T08:09:39.643 に答える
0

このようなものがうまくいく可能性があります:

// OOPS: This won't work because Max is defined the way it is. Always bugged me...
var result = elements.Select((e, i) => new {Element = e, Index = i}).Max(x => x.Element).Select(x => x.Index);

ああ、ネズミ。右。これは機能しません。それでは、オールラウンダーを引き出しましょう: Aggregate. どうぞ:

var elements = new List<int>{1, 7, 2, 5};
var result = elements.Select((e, i) => new {Element = e, Index = i})
    .Aggregate(
        new { Element = elements.First(), Index = -1}, // gotta start somewhere and Element is non-nullable according to OP
        (max, next) => (max.Element > next.Element) && max.Index >= 0 ? max : next,
        max => max.Index);

これにより、 が得られ1ます。それは役に立ちましたか?

于 2012-05-24T07:54:22.540 に答える