Saya sering melihat orang menggunakan Where.FirstOrDefault()
untuk melakukan pencarian dan mengambil elemen pertama. Kenapa tidak pakai saja Find()
? Apakah ada keuntungan bagi yang lain? Saya tidak bisa membedakan.
namespace LinqFindVsWhere
{
class Program
{
static void Main(string[] args)
{
List<string> list = new List<string>();
list.AddRange(new string[]
{
"item1",
"item2",
"item3",
"item4"
});
string item2 = list.Find(x => x == "item2");
Console.WriteLine(item2 == null ? "not found" : "found");
string item3 = list.Where(x => x == "item3").FirstOrDefault();
Console.WriteLine(item3 == null ? "not found" : "found");
Console.ReadKey();
}
}
}
c#
linq
linq-to-objects
KingOfHypocrites
sumber
sumber
list.FirstOrDefault(x => x == "item3");
lebih ringkas daripada menggunakan keduanya.Where
dan.FirstOrDefault
.Find
sebelum LINQ. (itu tersedia di. NET 2.0 dan Anda tidak bisa menggunakan lambdas. Anda dipaksa untuk menggunakan metode normal atau metode anonim)Jawaban:
Di mana
Find
metode iniIEnumerable<T>
? (Pertanyaan retoris.)The
Where
danFirstOrDefault
metode yang berlaku terhadap beberapa jenis urutan, termasukList<T>
,T[]
,Collection<T>
, dll urut Setiap yang mengimplementasikanIEnumerable<T>
dapat menggunakan metode ini.Find
hanya tersedia untukList<T>
. Metode yang umumnya lebih dapat diterapkan, kemudian lebih dapat digunakan kembali dan memiliki dampak yang lebih besar.Find
padaList<T>
mendahului metode lain.List<T>
ditambahkan dengan obat generik di .NET 2.0, danFind
merupakan bagian dari API untuk kelas itu.Where
danFirstOrDefault
ditambahkan sebagai metode ekstensi untukIEnumerable<T>
dengan Linq, yang merupakan versi NET berikutnya. Saya tidak bisa mengatakan dengan pasti bahwa jika Linq ada dengan rilis 2.0 yangFind
tidak akan pernah ditambahkan, tapi itu bisa dibilang kasus untuk banyak fitur lain yang datang di versi NET sebelumnya. Yang dibuat usang atau berlebihan oleh versi yang lebih baru.sumber
Where(condition).FirstOrDefault()
mengoptimalkan setidaknya juga dan kadang-kadang lebih baik daripadaFirstOrDefault(condition)
sendiri. Kami selalu menggunakanWhere()
untuk mendapatkan peningkatan kinerja saat tersedia.Saya baru tahu hari ini, melakukan beberapa tes pada daftar objek 80K dan menemukan bahwa
Find()
bisa hingga 1000% lebih cepat daripada menggunakanWhere
denganFirstOrDefault()
. Saya tidak tahu itu sampai menguji timer sebelum dan sesudah semua. Terkadang itu adalah waktu yang sama, jika tidak lebih cepat.sumber
.ToList()
atau.ToArray()
untuk benar-benar melakukan kueri.Find
memanfaatkan kunci utama (karenanya indeks), sedangkanWhere
kueri sql sederhanaAda perbedaan yang sangat penting jika sumber data adalah Entity Framework:
Find
akan menemukan entitas dalam status 'tambah' yang belum bertahan, tetapiWhere
tidak akan. Ini dengan desain.sumber
Find
hanya diimplementasikan dalamList<T>
, sambilWhere().FirstOrDefault()
bekerja dengan semuaIEnumerable<T>
.sumber
selain Anthony menjawab
Where()
kunjungan melalui semua catatan dan kemudian kembali hasil (s) sementaraFind()
tidak perlu menelusuri semua catatan jika predikat cocok dengan predikat yang diberikan.jadi katakanlah Anda memiliki Daftar kelas Uji memiliki
id
danname
properti.Akan memberikan hasil
2
, dan hanya 2 kunjungan yang diperlukan untuk memberikan hasil, tetapi jika Anda menggunakanWhere().FirstOrDefault()
kami akan mengunjungi semua catatan dan kemudian kami mendapatkan hasil.Jadi, ketika Anda tahu Anda hanya ingin hasil pertama dari catatan dalam koleksi
Find()
akan lebih cocokWhere().FirtorDefault();
sumber
FirstOrDefault
akan 'menggembungkan' rantai dan berhenti menghitung semuanya. Saya menggunakan istilah 'bubble-up' karena kurangnya ekspresi yang lebih baik, karena sebenarnya setiap pemilih / predikat akan diteruskan ke yang berikutnya, sehingga metode terakhir dalam rantai sebenarnya melakukan pekerjaan terlebih dahulu.Wow saya baru saja menonton tutorial EF dari MicrosofToolbox hari ini di Youtube. Dia memang mengatakan tentang menggunakan Find () dan FirstOrDefault (kondisi) dalam kueri dan Find () akan mencari data yang telah Anda lakukan sesuatu pada objek itu (menambah atau mengedit atau menghapus - tetapi belum disimpan ke dalam database) sementara itu FirstOrDefault hanya akan cari apa yang sudah disimpan
sumber
Find()
adalah setara IEnumerable dari aFirstOrDefault()
. Anda tidak harus rantai keduanya. Dimana () dengan.FirstOrDefault()
karena.Where()
melewati seluruh array dan kemudian akan beralih melalui daftar itu untuk menemukan item pertama. Anda menghemat banyak waktu dengan menempatkan predikat pencarian Anda dalamFirstOrDefault()
metode ini.Juga, saya mendorong Anda untuk membaca pertanyaan yang ditautkan ke utas ini untuk mengetahui lebih banyak tentang kinerja yang lebih baik dalam menggunakan
.Find()
skenario spesifik Performance of Find () vs FirstOrDefault ()sumber