2

述語はブール値を返し、汎用パラメーターを受け取る関数へのデリゲートであることを理解しています。私が言うとき、私はそれを理解しています。

mycustomer => mycustomer.fullname == 1

それは実際には次のことを意味します:

delegate (Customer mycustomer)
{
  return mycustomer.fullName == "John";
}

このラムダ式を渡すときに渡すパラメーターは次のとおりです。

public delegate bool Criteria<T>(T value)これはネイティブに述語と呼ばれます

しかし、私が理解していないのは、私が言うときそれが何を意味するのかということですmycustomer=>mycustomer.fullname

customers.OrderBy(mycustomer=>mycustomer.fullname);

どうすれば次のようなものを実装できますOrderByか?どのプロパティに対してアクションを実行するかをメソッドに指示するにはどうすればよいですか?前の例のように?

例として、特定のプロパティのコレクションのすべての値を取得するメソッドを作成したい場合があります。

list<string> mylist = customers.GetPropertyValues(cus=>cus.Fullname);

前もって感謝します。

4

4 に答える 4

3

は、アイテムを並べ替えるために内部で使用Func<TElement,TKey>されるを作成するために使用されます。あなたがするとき:IComparer<TKey>OrderedEnumerable

var items = myList.OrderBy(i => i.SomeProperty);

OrderedEnumerableタイプはIComparer<TKey>内部で作成しています。上記の例では、もしそうならi.SomePropertyStringのインスタンスを作成IComparer<String>し、メンバーのその比較子を使用して列挙可能なソース内のアイテムを並べ替えますSomeProperty

最後のケースでは:

list<string> mylist = customers.GetPropertyValues(cus=>cus.Fullname);

これを使用してこれを行いますSelect

var names = customers.Select(c => c.Fullname);

Stringこれは、列挙可能な名前を返します。このSelectメソッドでは、Func<TSource, TResult>を使用して、結果に追加するターゲット要素を選択します。

これを自分で複製するには、次のようにします。

public static IEnumerable<TMember> GetPropertyValues<TSource, TMember>
  (this IEnumerable<TSource> enumerable, Func<TSource, TMember> selector)
{
  if (enumerable == null)
    throw new ArgumentNullException("enumerable");

  foreach (TSource item in enumerable)
  {
    yield return selector(item);
  }
}
于 2010-08-04T08:32:34.797 に答える
2

次のようなものを作成できます。

static class ExtensionClass
{
    static IEnumerable<V> GetPropertyValues<T, V>(this IList<T> collection, Func<T, V> func)
    {
        foreach(var item in collection)
        {
            yield retun func(item);
        }
    }
}

しかし、Selectメソッドがあなたに合わない理由を私は本当に理解していません。

于 2010-08-04T08:33:45.463 に答える
2

しかし、私が理解していないのは、mycustomer=>mycustomer.fullnameと言ったときの意味です

これは、fullNameのみを返すことを除いて、デリゲートの例と同じです。遅延評価できるようにラムダとして渡されます。

OrderByGetPropertyValuesがと同じように見えることに加えて、のように機能するメソッドを作成する場合customers.Select(c => c.Fullname)は、ジェネリックスと拡張メソッドの海に飛び込む必要があります。実際には、次のように定義されOrderByた単なる拡張メソッドです。IEnumerable

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)

@Mikeからの回答はその一例であり、LINQの再実装でもあるようですSelect

于 2010-08-04T09:08:20.833 に答える
1

OrderBy Extension Methodonクラスは、型のEnumerableメソッドをFunc引数として取ります。これがドキュメントです。

これがあなたが使うことができるもう一つの良い記事です。

于 2010-08-04T08:35:30.580 に答える