繁体   English   中英

C#中的匿名代理和通用列表

[英]Anonymous Delegates and generic Lists in C#

你能解释一下下面的代码:

private static List<Post> _Posts;
public static Post GetPost(Guid id)
{
    return _Posts.Find(delegate(Post p)
    {
        return p.Id == id;
    });
}
  1. 通过这种方式在通用列表中找到对象有什么意义? 他可以简单地迭代列表。

  2. 这个委托方法如何为列表的每个元素调用?

注意:如果这有一个共同的名称,你可以更新我的问题标题吗?

谢谢 !

你可以在列表中进行迭代,你可以将问题中的代码视为概念上与以下相同:

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);
}

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

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

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

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

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

delegateInstance(arg1,arg2);

如果您使用的是C#3.0或更高版本,则可以使用Linq在List中快速查找对象。

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

List.Find(谓词匹配)不是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);
}

LINQ:

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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM