Di sini saya punya contoh sederhana untuk menemukan item dalam daftar string. Biasanya saya gunakan untuk loop atau delegasi anonim untuk melakukannya seperti ini:
int GetItemIndex(string search)
{
int found = -1;
if ( _list != null )
{
foreach (string item in _list) // _list is an instance of List<string>
{
found++;
if ( string.Equals(search, item) )
{
break;
}
}
/* use anonymous delegate
string foundItem = _list.Find( delegate(string item) {
found++;
return string.Equals(search, item);
});
*/
}
return found;
}
LINQ baru bagi saya. Saya ingin tahu apakah saya dapat menggunakan LINQ untuk menemukan item dalam daftar? Bagaimana jika memungkinkan?
Jawaban:
Ada beberapa cara (perhatikan ini bukan daftar lengkap).
1) Lajang akan mengembalikan hasil tunggal, tetapi akan mengeluarkan pengecualian jika tidak menemukan atau lebih dari satu (yang mungkin atau mungkin tidak seperti yang Anda inginkan):
Note
SingleOrDefault()
akan berperilaku sama, kecuali akan mengembalikan nol untuk tipe referensi, atau nilai default untuk tipe nilai, alih-alih melemparkan pengecualian.2) Di mana akan mengembalikan semua item yang sesuai dengan kriteria Anda, sehingga Anda dapat memperoleh jumlah IEn dengan satu elemen:
3) Pertama akan mengembalikan item pertama yang cocok dengan kriteria Anda:
Note
FirstOrDefault()
akan berperilaku sama, kecuali akan mengembalikan nol untuk tipe referensi, atau nilai default untuk tipe nilai, alih-alih melemparkan pengecualian.sumber
ReadOnlyCollection
atauObservableCollection
?IEnumerable<T>
atauIQueryable<T>
Jika Anda ingin indeks elemen, ini akan melakukannya:
Anda tidak dapat menyingkirkan lambda di pass pertama.
Perhatikan bahwa ini akan melempar jika item tidak ada. Ini menyelesaikan masalah dengan beralih ke int nullable:
Jika Anda menginginkan item:
Jika Anda ingin menghitung jumlah item yang cocok:
Jika Anda ingin semua item yang cocok:
Dan jangan lupa untuk memeriksa daftar untuk
null
semua kasus ini.Atau gunakan
(list ?? Enumerable.Empty<string>())
sebagai gantilist
.Terima kasih kepada Pavel untuk membantu dalam komentar.
sumber
string.Equals
sini - tidak ada yang salah dengan itu==
. Kedua, saya juga menyebutkanFirstOrDefault
(untuk kasus-kasus di mana item mungkin tidak ada di sana), danSelect
dengan indeks untuk mencakup kasus di mana indeks item diperlukan (seperti yang ada dalam sampel dalam pertanyaan itu sendiri).ArgumentNullException
jika sumbernya nolJika benar-benar
List<string>
Anda tidak membutuhkan LINQ, cukup gunakan:Jika Anda mencari item itu sendiri, coba:
sumber
_list.Find(search)
untuk yang kedua.Apakah Anda ingin item dalam daftar atau item yang sebenarnya itu sendiri (akan menganggap item itu sendiri).
Berikut adalah banyak opsi untuk Anda:
sumber
Metode ini lebih mudah dan aman
bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false
sumber
true : false
bawah ini harus bekerja samabool insertOrderNew = lOrders.Find(r => r == "1234") == null;
Bagaimana dengan
IndexOf
?Sebagai contoh
Perhatikan bahwa ia mengembalikan -1 jika nilainya tidak muncul dalam daftar
sumber
Saya dulu menggunakan Kamus yang merupakan semacam daftar yang diindeks yang akan memberi saya apa yang saya inginkan ketika saya menginginkannya.
Setiap kali saya ingin mengakses nilai margin saya, misalnya, saya menjawab kamus saya:
Jadi, tergantung pada apa yang Anda lakukan, kamus bisa bermanfaat.
sumber
Berikut adalah salah satu cara untuk menulis ulang metode Anda untuk menggunakan LINQ:
Jadi, menyebutnya dengan
GetItemIndex("two")
akan kembali1
,dan
GetItemIndex("notthere")
akan kembali-1
.Referensi: linqsamples.com
sumber
Coba kode ini:
sumber
Jika kita perlu menemukan elemen dari daftar, maka kita dapat menggunakan metode
Find
danFindAll
ekstensi, tetapi ada sedikit perbedaan di antara mereka. Berikut ini sebuah contoh.sumber
Ini akan membantu Anda mendapatkan nilai pertama atau standar dalam pencarian Daftar Linq Anda
Pencarian ini akan menemukan nilai pertama atau standar yang akan dikembalikan.
sumber
Anda ingin mencari objek di daftar objek.
Ini akan membantu Anda mendapatkan nilai pertama atau standar dalam pencarian Daftar Linq Anda.
atau
sumber
Anda bisa menggunakan FirstOfDefault dengan ekstensi Where Linq untuk mendapatkan kelas MessageAction dari IEnumerable. Reme
var action = Message.Actions.Where (e => e.targetByName == className) .FirstOrDefault ();
dimana
Daftar Tindakan {get; set; }
sumber