Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何列表';s Find(s)方法在C中有效#_C#_.net - Fatal编程技术网

C# 如何列表';s Find(s)方法在C中有效#

C# 如何列表';s Find(s)方法在C中有效#,c#,.net,C#,.net,循环浏览列表的最佳方式是什么?for循环比众多列表类的find方法好吗?另外,如果我使用下面提到的find方法(匿名委托是谓词委托的实例),它是否比使用lambda表达式更好?哪一个执行速度更快 var result = Books.FindLast( delegate(Book bk) { DateTime year2001 = new DateTime(2001,01,01); return bk.Publish

循环浏览列表的最佳方式是什么?for循环比众多列表类的find方法好吗?另外,如果我使用下面提到的find方法(匿名委托是谓词委托的实例),它是否比使用lambda表达式更好?哪一个执行速度更快

var result = Books.FindLast(
        delegate(Book bk)
        {
            DateTime year2001 = new DateTime(2001,01,01);
            return bk.Publish_date < year2001;
        });
var result=Books.FindLast(
代表(书籍bk)
{
DateTime year2001=新的日期时间(2001,01,01);
返回bk.Publish_日期<2001年;
});

这是一个复杂的问题,因为它涉及许多不同的主题

一般来说,委托的速度比简单的函数调用慢很多倍,但枚举列表(通过foreach)的速度也非常慢

如果您真的关心性能(但不要事先这样做,配置文件!),您应该避免委托和枚举。第一个重要步骤(只要可能)是使用哈希表而不是简单的列表

例子 现在,通过一些示例,我将以不同的方式编写相同的函数,从可读性更强(但速度较慢)到可读性较差(但速度更快)。我省略了所有错误检查,但实际函数不应该这样做(至少需要一些断言)

此函数使用LINQ,它更容易理解,但速度最慢。 注意
书籍
可以是通用枚举(不需要是
列表

现在有一个例子稍微复杂一点,但是搜索性能最好。算法是从普通方法派生的(请注意,如果要匹配与谓词匹配的第一个元素,可以直接使用该方法)。
注意,代码是未经测试的,也可以被优化,请考虑它只是一个例子。
public static Book FindLastBookPublishedBefore(List<Book> books,
                                               DateTime date)
{
 int min = 0, max = books.Count;
 Book candidate = null;

 while (min < max)
 {
  int mid = (min + max) / 2;
  Book book = books[mid];

  if (book.Publish_date > date)
   max = mid - 1;
  else
  {
   candidate = book;
   ++min;
  }

  if (min >= max)
   break;
 }

  return candidate;
}
公共静态图书FindLastBookPublished之前(列出图书,
日期时间(日期)
{
int min=0,max=books.Count;
图书候选=null;
同时(最小值<最大值)
{
int mid=(最小+最大)/2;
书=书[中];
如果(book.Publish_date>date)
max=mid-1;
其他的
{
候选人=书本;
++闵;
}
如果(最小值>=最大值)
打破
}
返回候选人;
}
在移动到更复杂的容器之前,您可能会考虑在第一次搜索之前保持您的
SortedList
未排序。它会非常慢(因为它也会对列表进行排序),但插入速度将与普通列表一样快(但您必须尝试使用真实数据)。总之,最后一个算法可以优化很多


也许如果你的收藏中有太多的物品,以至于你无法用普通的收藏来管理它们,你可能会想把所有的东西都转移到数据库中……哈哈,这是一个复杂的问题,因为它涉及很多不同的主题

一般来说,委托的速度比简单的函数调用慢很多倍,但枚举列表(通过foreach)的速度也非常慢

如果您真的关心性能(但不要事先这样做,配置文件!),您应该避免委托和枚举。第一个重要步骤(只要可能)是使用哈希表而不是简单的列表

例子 现在,通过一些示例,我将以不同的方式编写相同的函数,从可读性更强(但速度较慢)到可读性较差(但速度更快)。我省略了所有错误检查,但实际函数不应该这样做(至少需要一些断言)

此函数使用LINQ,它更容易理解,但速度最慢。 注意
书籍
可以是通用枚举(不需要是
列表

现在有一个例子稍微复杂一点,但是搜索性能最好。算法是从普通方法派生的(请注意,如果要匹配与谓词匹配的第一个元素,可以直接使用该方法)。
注意,代码是未经测试的,也可以被优化,请考虑它只是一个例子。
public static Book FindLastBookPublishedBefore(List<Book> books,
                                               DateTime date)
{
 int min = 0, max = books.Count;
 Book candidate = null;

 while (min < max)
 {
  int mid = (min + max) / 2;
  Book book = books[mid];

  if (book.Publish_date > date)
   max = mid - 1;
  else
  {
   candidate = book;
   ++min;
  }

  if (min >= max)
   break;
 }

  return candidate;
}
公共静态图书FindLastBookPublished之前(列出图书,
日期时间(日期)
{
int min=0,max=books.Count;
图书候选=null;
同时(最小值<最大值)
{
int mid=(最小+最大)/2;
书=书[中];
如果(book.Publish_date>date)
max=mid-1;
其他的
{
候选人=书本;
++闵;
}
如果(最小值>=最大值)
打破
}
返回候选人;
}
在移动到更复杂的容器之前,您可能会考虑在第一次搜索之前保持您的
SortedList
未排序。它会非常慢(因为它也会对列表进行排序),但插入速度将与普通列表一样快(但您必须尝试使用真实数据)。总之,最后一个算法可以优化很多


如果集合中的项目太多,无法用普通集合管理它们,您可能会想将所有内容都移动到数据库中……哈哈,使用任何能让代码更具可读性的东西。您可以通过使用lambda表达式简化上述代码;它们只是匿名委托的简化语法。只要可以使用委托,就可以使用lambda表达式或普通方法。将普通方法作为参数传递,不带括号

C#编译器实际上只是为匿名委托和lambda表达式创建了一个隐藏方法。你可能不会体验到任何速度上的差异

var result = Books.FindLast(bk => bk.Publish_date < new DateTime(2001,01,01));
var result=Books.FindLast(bk=>bk.Publish_date
使用任何使代码更具可读性的工具。您可以通过使用lambda表达式简化上述代码;它们只是匿名委托的简化语法。只要可以使用委托,就可以使用lambda表达式或普通方法。将普通方法作为参数传递,不带括号

C#编译器实际上只是为匿名委托和lambda表达式创建了一个隐藏方法。你可能不会体验到任何速度上的差异

var result = Books.FindLast(bk => bk.Publish_date < new DateTime(2001,01,01));
var result=Books.FindLast(bk=>bk.Publish_date
我还建议您
public static Book FindLastBookPublishedBefore(List<Book> books,
                                               DateTime date)
{
 int min = 0, max = books.Count;
 Book candidate = null;

 while (min < max)
 {
  int mid = (min + max) / 2;
  Book book = books[mid];

  if (book.Publish_date > date)
   max = mid - 1;
  else
  {
   candidate = book;
   ++min;
  }

  if (min >= max)
   break;
 }

  return candidate;
}
var result = Books.FindLast(bk => bk.Publish_date < new DateTime(2001,01,01));