5

以下のコードを説明してもらえますか:

private static List<Post> _Posts;
public static Post GetPost(Guid id)
{
    return _Posts.Find(delegate(Post p)
    {
        return p.Id == id;
    });
}
  1. そのようにして一般的なリストでオブジェクトを見つけるポイントは何ですか? 彼は単にリストを繰り返すことができます。

  2. この委譲されたメソッドが list の各要素に対してどのように呼び出されたのでしょうか?

注:これに共通の名前がある場合、私の質問のタイトルを更新できますか?

ありがとう !

4

5 に答える 5

19

あなたは彼がリストを反復できるのは正しいです。あなたの質問のコードは、概念的には次のものと同じであると考えることができます:

private static Post GetPost(Guid id)
{
    Post p = default(Post);

    foreach (Post post in _Posts)
    {
        if (post.Id == id)
        {
            p = post;
            break;
        }
    }

    return p;
}

スニペットを記述するのに必要なコードが少なくて済み、重要なことに、正確に見つける方法ではなく、見つけたいものを言っていることになります。

private static Post GetPost(Guid id)
{
    return _Posts.Find(delegate(Post p)
    {
        return p.Id == id;
    });
}

C# 3.0 では、これは「ラムダ式」と呼ばれるものを使用してさらに短縮できます。

private static Post NewGetPost(Guid id)
{
    return _Posts.Find(p => p.Id == id);
}

同じ目標を達成するために最小限の可読コードを使用すると、そのコードの作成者と読み取り者の両方がより幸せになります。

于 2009-02-04T21:43:14.270 に答える
7

He is using an anonymous delegate. He could have used a lambda expression instead:

Posts.Find(p => p.Id == id)

Also, wrapping access to the list in a method achieves nothing in this case and exposes the elements of the list to external callers. This is bad practice.

于 2009-02-04T21:22:34.437 に答える
3
  1. リストは基本的に各要素を調べて、要素がその要素に対して true を返すかどうかをチェックしますPredicate<T>。これは本質的にショートカットであるため、リストを反復処理する必要はありません。List<T>.Find(Predicate<T>)最適化が組み込まれている場合もあります。
  2. 次の構文を使用してデリゲートを呼び出します。

delegateInstance(arg1,arg2);

于 2009-02-04T21:24:38.100 に答える
1

List.Find(Predicate match) は LINQ 拡張メソッドではありません。これは、MSDN で示されているように、このメソッドが 2.0 以降のフレームワークに含まれているためです。次に、Find() を使用しても問題はありません。代替案よりも読みやすい傾向があります。

クラシック:

public static Post GetPost(Guid id)
{
  bool found = false;

  foreach(post in _Posts)
  { 
    if post.Id == id return post;
  }
  return default(Post);
}

リンク:

public static Post GetPost(Guid id)
{
  var post = (
    from p in _Posts 
    where p.Id = id 
    select p
  ).FirstOrDefault();
}

List.Find() を使用すると、アイテムを探していることがすぐにわかりますが、他のアイテムはこれを確認するためにロジックに従う必要があります。Find() は、基本的にリスト項目の反復をカプセル化します。Post クラスにメソッドがあれば、次のようpublic bool HasId(Guid id)に書くことができます

_Post.Find(post.HasId(id));
于 2009-02-04T22:14:56.717 に答える
1

C# 3.0 以降を使用している場合は、Linq を使用してリスト内のオブジェクトをすばやく見つけることができます。

public static Post GetPost(Guid id)
{
    return (from p in _Posts
            where p.Id == id
            select p).First();
}
于 2009-02-04T21:23:31.097 に答える