Có một hiệu quả thú vị lúc tìm tìm Diana trong một chuỗi béo kiểu tham chiếu đơn giản có nằm trong tính chuỗi đơn.Bạn đang xem: Firstordefault là gì
using System;using System.Collections.Generic;using System.Linq;public class Customer public string Name get;set;Stopwatch watch = new Stopwatch(); const string diana = "Diana"; while (Console.ReadKey().Key != ConsoleKey.Escape) //Armour with 1000k++ customers. Wow, should be a hàng hóa with a great success! :) var customers = (from i in Enumerable.Range(0, 1000000) select new Customer Name = Guid.NewGuid().ToString() ).ToList(); customers.Insert(999000, new Customer Name = diana ); // Putting Diana at the end :) //1. System.Linq.Enumerable.DefaultOrFirst() watch.Restart(); customers.FirstOrDefault(c => c.Name == diana); watch.Stop(); Console.WriteLine("Diana was found in 0 ms with System.Linq.Enumerable.FirstOrDefault().", watch.ElapsedMilliseconds); //2. System.Collections.Generic.List.Find() watch.Restart(); customers.Find(c => c.Name == diana); watch.Stop(); Console.WriteLine("Diana was found in 0 ms with System.Collections.Generic.List.Find().", watch.ElapsedMilliseconds);

Đây có phải là do không có Trình tinh chỉnh trong List.Find () hoặc điều đó cộng với hoàn toàn có thể là trang bị gì không giống không?
Find() chạy cấp tốc hơn ngay gần gấp đôi, mong muốn . đội Net đang không lưu lại nó lạc hậu trong tương lai.
Bạn đang xem: Firstordefault là gì
c#.netperformancelinqTôi đã có thể bắt chước tác dụng của các bạn vì vậy tôi đang dịch ngược chương trình của bạn và tất cả một sự biệt lập giữa Find với FirstOrDefault.
Đầu tiên ở đây là chương trình dịch ngược. Tôi đã làm cho đối tượng người sử dụng dữ liệu của bạn trở thành một mục dữ liệu không đồng bộ chỉ để biên dịch
List> source = Enumerable.ToList(Enumerable.Select(Enumerable.Range(0, 1000000), i => var local_0 = new Name = Guid.NewGuid().ToString() ; return local_0; )); source.Insert(999000, new Name = diana ); stopwatch.Restart(); Enumerable.FirstOrDefault(source, c => c.Name == diana); stopwatch.Stop(); Console.WriteLine("Diana was found in 0 ms with System.Linq.Enumerable.FirstOrDefault().", (object) stopwatch.ElapsedMilliseconds); stopwatch.Restart(); source.Find(c => c.Name == diana); stopwatch.Stop(); Console.WriteLine("Diana was found in 0 ms with System.Collections.Generic.List.Find().", (object) stopwatch.ElapsedMilliseconds);Điều đặc biệt quan trọng cần chú ý ở đó là FirstOrDefault được điện thoại tư vấn trên Enumerable trong lúc Find được gọi là 1 trong phương thức trong list nguồn.
Vì vậy, tìm thấy đang có tác dụng gì? Đây là cách tiến hành Find dịch ngược
Tuy nhiên, FirstOrDefault, bên trên lớp Enumerable, áp dụng foreach nhằm lặp lại các mục. Điều này áp dụng một trình vòng lặp vào list và dịch rời tiếp theo. Tôi nghĩ đông đảo gì nhiều người đang thấy là chi tiêu chung của trình vòng lặp
public static TSource FirstOrDefault(this IEnumerable source, Func predicate) if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.ArgumentNull("predicate"); foreach (TSource source1 in source) if (predicate(source1)) return source1; return mặc định (TSource);Foreach chỉ với đường tổng hợp khi áp dụng mẫu vô số. Quan sát vào hình ảnh này

.
Tôi đang nhấp vào foreach để xem hầu như gì nó đang làm cho và bạn cũng có thể thấy dotpeek ý muốn đưa tôi đến khảo sát viên/hiện tại/tiếp theo tất cả ý nghĩa.
Khác với điều này về cơ bản là giống nhau (kiểm tra vị ngữ được thông qua để xem liệu một mục có phải là điều bạn có nhu cầu không)
Tôi cá cược rằng FirstOrDefault đang hoạt động qua thực thi IEnumerable, nghĩa là, nó sẽ thực hiện vòng lặp foreach tiêu chuẩn để triển khai kiểm tra. List.Find() không hẳn là 1 phần của Linq ( http://msdn.Microsoft.com/en-us/l Library/x0b5b5bc.aspx ) và có tác dụng sử dụng một tiêu chuẩn chỉnh for vòng lặp trường đoản cú 0 cho Count (hoặc một phép tắc nội cỗ nhanh khác gồm thể chuyển động trực tiếp trên mảng mặt trong/được bọc của nó). Bằng cách loại bỏ giá cả liệt kê trải qua (và triển khai kiểm tra phiên bạn dạng để bảo vệ rằng danh sách chưa được sửa đổi), cách thức Find cấp tốc hơn.Xem thêm: Luật Đánh Tài Xỉu Là Gì ? Hướng Dẫn Đánh Tài Xỉu Bóng Đá Từ A Đến Z
Nếu bạn thêm một bài bác kiểm tra trang bị ba:
//3. System.Collections.Generic.List foreachFunc dianaCheck = c => c.Name == diana;watch.Restart();foreach(var c in customers) if (dianaCheck(c)) break;watch.Stop();Console.WriteLine("Diana was found in 0 ms with System.Collections.Generic.List foreach.", watch.ElapsedMilliseconds);Nó chạy với tốc độ tương đương với tốc độ trước tiên (25ms so với 27ms mang lại FirstOrDefault)
EDIT: trường hợp tôi thêm 1 vòng lặp mảng, nó sẽ khá gần với vận tốc Find() cùng được devshorts quan sát trộm mã nguồn, tôi suy nghĩ rằng phía trên là:
//4. System.Collections.Generic.List for loopvar customersArray = customers.ToArray();watch.Restart();int customersCount = customersArray.Length;for (int i = 0; i Điều này chỉ chạy chậm hơn 5,5% so với thủ tục Find().
Vì vậy, mẫu dưới cùng: lặp qua các thành phần mảng cấp tốc hơn so với giải pháp xử lý foreach lặp bên trên đầu. (nhưng cả hai đều phải sở hữu ưu/nhược điểm của chúng, vày vậy chỉ cần chọn điều phải chăng cho mã của chúng ta một phương pháp hợp lý. Rộng nữa, chỉ thi thoảng khi sự không giống biệt nhỏ dại về vận tốc gây nên một vấn đề, vị vậy chỉ cần sử dụng những gì có chân thành và ý nghĩa cho kỹ năng duy trì/khả năng đọc)
24 LINQ: không phải ngẫu nhiên vs tất cả Đừng
Khổ dữ Đầu tiên cùng khi sống VIỆT NAM. Khát từ với LINQ?
Xử lý lưu ý cho những phép liệt kê của IEnumerable
Đo thời gian đúng mực để đánh giá hiệu suất
Làm cách nào để đăng nhập C # nhưng mà không thực hiện thư viện của mặt thứ 3?
Nhận toàn bộ các tên cột của DataTable vào mảng chuỗi bằng cách sử dụng (LINQ/Dự đoán)
Áp dụng chức năng cho toàn bộ các yếu tố của tủ đồ thông qua LINQ
Làm cố nào để có được chỉ mục của một trong những phần tử trong IEnumerable?
in tất cả nội dung của mảng trong C #
Phân trang cùng với LINQ cho những đối tượng
Linq Query thường xuyên ném "Không thể chế tác giá trị không đổi của nhiều loại System.Object ....", trên sao?
Làm cầm nào để gia công việc với bọn chúng tôi
Cách cập nhật phần tử với danh sách bằng LINQ cùng C #
" data-cat="related-question">Sử dụng LINQ nhằm xóa các thành phần khỏi list