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 中,这可以使用所谓的“ lambda 表达式”进一步缩短为:

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

使用最少的可读代码来实现相同的目标使该代码的编写者和读者都更快乐。

于 2009-02-04T21:43:14.270 回答
7

他正在使用匿名代表。他本可以使用lambda 表达式

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

此外,在方法中包装对列表的访问在这种情况下没有任何效果,并且会将列表的元素暴露给外部调用者。这是不好的做法。

于 2009-02-04T21:22:34.437 回答
3
  1. List 基本上遍历每个元素并检查该元素是否为此返回 true Predicate<T>。它本质上是一个快捷方式,因此您不必遍历列表。List<T>.Find(Predicate<T>)可能还有一些内置的优化。
  2. 您使用以下语法调用委托:

delegateInstance(arg1,arg2);

于 2009-02-04T21:24:38.100 回答
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 回答
1

List.Find(Predicate match) 不是 LINQ 扩展方法,因为该方法自 2.0 以来就已在框架中,如 MSDN 所示。其次,使用 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 回答