Anda juga dapat menulis metode ekstensi umum yang berfungsi untuk Enumerable<T>:
///<summary>Finds the index of the first item matching an expression in an enumerable.</summary>///<param name="items">The enumerable to search.</param>///<param name="predicate">The expression to test the items against.</param>///<returns>The index of the first matching item, or -1 if no items match.</returns>publicstaticintFindIndex<T>(thisIEnumerable<T> items,Func<T,bool> predicate){if(items ==null)thrownewArgumentNullException("items");if(predicate ==null)thrownewArgumentNullException("predicate");int retVal =0;foreach(var item in items){if(predicate(item))return retVal;
retVal++;}return-1;}
Dan Anda juga dapat menggunakan LINQ:
int keyIndex = words.Select((v, i)=>new{Word= v,Index= i}).FirstOrDefault(x => x.Word.IsKey)?.Index??-1;
+1 tetapi, bagaimana jika item tidak ada? kita akan mendapatkan 0, tetapi indeksnya -1
Arsen Mkrtchyan
@ArsenMkrtchyan Jika item tidak ada, ini menghasilkan kata
Jim Balter
@ArsenMkrtchyan Anda menulis "kami akan mendapatkan 0" ... itu salah. Anda menulis "tetapi indeksnya -1" ... itu juga salah. -1 adalah indikator kegagalan yang umum, tetapi itu bukan satu-satunya yang mungkin. Nilai apa pun yang tidak berada dalam 0..words.Length-1 akan dilakukan.
Jim Balter
1
@JimBalter, maksud saya jika item tidak ada ekspresi akan mengembalikan 0, apa yang salah di dalamnya? Saya setuju bahwa -1 adalah indikator umum, tetapi setuju bahwa 99% kasus -1 adalah nilai yang diharapkan jika item tidak ada. setidaknya 0 salah ketika item tidak ada
Arsen Mkrtchyan
7
Jika Anda ingin mencari kata yang bisa Anda gunakan
var word = words.Where(item => item.IsKey).First();
Ini memberi Anda item pertama yang IsKey benar (jika mungkin ada non, Anda mungkin ingin menggunakan .FirstOrDefault()
Untuk mendapatkan item dan indeks, Anda dapat menggunakan
KeyValuePair<WordType,int> word = words.Select((item, index)=>newKeyValuePair<WordType,int>(item, index)).Where(item => item.Key.IsKey).First();
Ini sepertinya solusi yang sangat lemah dibandingkan dengan jawaban Grizzly dan masenkablast. masenkablast menjawab pertanyaan asli dan Grizzly memberikan solusi yang lebih baik untuk menemukan kata tersebut, karena "var" terakhirnya adalah kata sebenarnya dan bukan <TSource> yang tidak terhitung banyaknya yang berisi 1 kata.
Yakobus
2
Baru saja memposting penerapan metode ekstensi IndexWhere () saya (dengan pengujian unit):
Jawaban:
Itu benar-benar memberi Anda indeks integer dan bukan objeknya, terlepas dari kelas khusus apa yang telah Anda buat
sumber
System.Linq
secara default? Di situlah segalanya seperti ini!Untuk array, Anda dapat menggunakan
Array.FindIndex<T>
:Untuk daftar, Anda dapat menggunakan
List<T>.FindIndex
:Anda juga dapat menulis metode ekstensi umum yang berfungsi untuk
Enumerable<T>
:Dan Anda juga dapat menggunakan LINQ:
sumber
sumber
Jika Anda ingin mencari kata yang bisa Anda gunakan
Ini memberi Anda item pertama yang IsKey benar (jika mungkin ada non, Anda mungkin ingin menggunakan
.FirstOrDefault()
Untuk mendapatkan item dan indeks, Anda dapat menggunakan
sumber
First
, dibutuhkan predikat, Anda tidak perlu ekstensiWhere
.Coba ini...
sumber
Baru saja memposting penerapan metode ekstensi IndexWhere () saya (dengan pengujian unit):
http://snipplr.com/view/53625/linq-index-of-item--indexwhere/
Contoh penggunaan:
sumber
Solusi ini membantu saya lebih banyak, dari msdn microsoft :
query
adalahtoList()
pertanyaan Anda .sumber
sumber