FIRSTORDEFAULT LÀ GÌ

     

Có một tác dụng thú vị lúc tìm kiếm Diana trong một chuỗi lớn kiểu tham chiếu dễ dàng có ở trong tính chuỗi đơn.

Bạn đang xem: Firstordefault là gì

Bạn đã 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 sản phẩm 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 over :) //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 liệu có phải là do không có Trình điều khiển và tinh chỉnh trong List.Find () hoặc điều đó cộng với rất có thể là đồ vật gì khác không?

Find() chạy cấp tốc hơn ngay sát gấp đôi, mong muốn . Team Net vẫn không khắc ghi nó lạc hậu trong tương lai.

c#.netperformancelinqTôi đã có thể bắt chước hiệu quả của bạn vì vậy tôi sẽ dịch ngược chương trình của người sử dụng và tất cả một sự biệt lập giữa Find và FirstOrDefault.

Đầu tiên ở đó là chương trình dịch ngược. Tôi đã làm cho đối tượng người dùng dữ liệu của chúng ta trở thành một mục tài liệu không đồng nhất chỉ nhằm 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 quan trọng cần chú ý ở đấy là FirstOrDefault được gọi trên Enumerable trong khi Find được gọi là 1 trong phương thức trong danh sách nguồn.

Xem thêm: Iphone Unlock This Iphone Là Gì ? Cách Unlock Iphone Như Thế Nào?

Vì vậy, search thấy đang làm cho gì? Đây là cách làm Find dịch ngược

Tuy nhiên, FirstOrDefault, trên lớp Enumerable, áp dụng foreach để lặp lại các mục. Điều này thực hiện một trình vòng lặp vào danh sách và dịch rời tiếp theo. Tôi nghĩ số đông gì ai đang thấy là túi tiền 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 default (TSource);Foreach chỉ cần đường tổng thích hợp khi áp dụng mẫu vô số. Chú ý vào hình ảnh này


*

.

Tôi đang nhấp vào foreach nhằm xem đông đảo gì nó đang làm và chúng ta có thể thấy dotpeek muốn đưa tôi đến khảo sát viên/hiện tại/tiếp theo bao gồm ý nghĩa.

Xem thêm: Nghĩa Của Từ Nguyên Tác Là Gì ? Nguyên Tác Nghĩa Là Gì

Khác với điều đó về cơ phiên bản là như thể nhau (kiểm tra vị ngữ được trải qua để coi liệu một mục liệu có phải là điều bạn muốn không)

Nếu chúng ta thêm một bài kiểm tra máy 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 cùng với tốc độ đầu tiên (25ms đối với 27ms mang lại FirstOrDefault)

EDIT: trường hợp tôi thêm một vòng lặp mảng, nó sẽ khá gần với tốc độ Find() cùng được devshorts chú ý trộm mã nguồn, tôi nghĩ rằng đây 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 trễ hơn 5,5% so với cách tiến hành Find().

Vì vậy, dòng dưới cùng: lặp qua các bộ phận mảng cấp tốc hơn so với giải pháp xử lý foreach lặp trên đầu. (nhưng cả hai đều phải sở hữu ưu/nhược điểm của chúng, vị vậy chỉ việc chọn điều hợp lí cho mã của công ty một phương pháp hợp lý. Rộng nữa, chỉ hãn hữu khi sự khác biệt nhỏ về vận tốc tạo ra một vấn đề, bởi vì vậy chỉ cần sử dụng gần như 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 toàn bộ Đừng

Khổ dữ Đầu tiên và khi sinh hoạt VIỆT NAM. Khát trường đoản cú với LINQ?

Xử lý chú ý cho nhiều phép liệt kê của IEnumerable

Đo thời gian đúng chuẩn để chất vấn hiệu suất

Làm giải pháp nào để singin 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 thương hiệu cột của DataTable vào mảng chuỗi bằng phương pháp sử dụng (LINQ/Dự đoán)

Áp dụng chức năng cho tất cả các nguyên tố của tủ đồ thông qua LINQ

Làm cố nào để có được chỉ mục của một phần tử trong IEnumerable?

in toàn bộ nội dung của mảng vào C #

Phân trang cùng với LINQ cho các đối tượng

Linq Query thường xuyên ném "Không thể sản xuất giá trị không thay đổi của một số loại System.Object ....", tại sao?

Làm nắm nào để triển khai việc với bọn chúng tôi

Cách cập nhật phần tử với list bằng LINQ và C #

" data-cat="related-question">Sử dụng LINQ nhằm xóa những thành phần khỏi list