2

最初に、この質問のタイトルが意味を成すかどうかはわかりませんが、問題をどのように表現すればよいかわかりません。

次のように定義されたクラスがあります

public static class NaturalSort<T>

このクラスにはメソッドがあります

public static IEnumerable<T> Sort(IEnumerable<T> list, Func<T, String> field)

基本的に、並べ替える値を返す Func を指定して、リストに対して自然な並べ替えを実行します。私はこれを、自然な並べ替えをしたいものに使用してきました。

通常、私は次のようなことをします

sorted = NaturalSort<Thing>.sort(itemList, item => item.StringValueToSortOn)

今、並べ替えたい値がアイテムのフィールドではなく、何らかのメソッドの呼び出しである場合があります

何かのようなもの

sorted = NaturalSort<Thing>.sort(itemList, item => getValue(item))

getValue が文字列ではなくオブジェクトを返したらどうなるでしょうか。文字列値を取得するには、いくつかの条件付きロジックを実行する必要があります

sorted = NaturalSort<Thing>.sort(itemList, item => getValue(item).Something == null ? getValue(item).SomethingElse : getValue(item).SomeotherThing)

getValue への呼び出しが高価であり、3 回呼び出したくない場合を除いて、これは機能します。式の中で一度呼び出す方法はありますか?

4

2 に答える 2

5

はい、ラムダには複数行のコードを含めることができます。

item =>
{
  var it = getvalue(item);
  return it.Something == null ? it.SomethingElse : it.SomeotherThing;
}

デリゲートを使用する場合は、この構文で値を返すようにしてください。Func<T>これは短い構文では暗黙的に処理されますが、複数行の構文では自分で行う必要があります。

また、Sortメソッドを拡張メソッドにする必要があります。クラスの型パラメーターも必要ありません。単に使用します

public static IEnumerable<T> Sort<T>(this IEnumerable<T> list, Func<T, String> field)
于 2011-04-08T14:13:10.757 に答える
0

@Femaref は 100% です。

sorted = NaturalSort<Thing>.sort(itemList, item => getValue(item))
         .Select(item => item.Something == null ? item.SomethingElse : item.SomeotherThing)
于 2011-04-08T14:19:48.580 に答える