Dapatkah LINQ digunakan untuk menemukan indeks nilai dalam array?
Misalnya, loop ini menempatkan indeks kunci dalam sebuah array.
for (int i = 0; i < words.Length; i++)
{
if (words[i].IsKey)
{
keyIndex = i;
}
}
Dapatkah LINQ digunakan untuk menemukan indeks nilai dalam array?
Misalnya, loop ini menempatkan indeks kunci dalam sebuah array.
for (int i = 0; i < words.Length; i++)
{
if (words[i].IsKey)
{
keyIndex = i;
}
}
Jawaban:
int keyIndex = Array.FindIndex(words, w => w.IsKey);
Itu benar-benar memberi Anda indeks integer dan bukan objeknya, terlepas dari kelas khusus apa yang telah Anda buat
System.Linq
secara default? Di situlah segalanya seperti ini!
Untuk array, Anda dapat menggunakan
Array.FindIndex<T>
:
int keyIndex = Array.FindIndex(words, w => w.IsKey);
Untuk daftar, Anda dapat menggunakan List<T>.FindIndex
:
int keyIndex = words.FindIndex(w => w.IsKey);
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>
public static int FindIndex<T>(this IEnumerable<T> items, Func<T, bool> predicate) {
if (items == null) throw new ArgumentNullException("items");
if (predicate == null) throw new ArgumentNullException("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;
int keyIndex = words.TakeWhile(w => !w.IsKey).Count();
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) => new KeyValuePair<WordType, int>(item, index)).Where(item => item.Key.IsKey).First();
First
, dibutuhkan predikat, Anda tidak perlu ekstensi Where
.
Coba ini...
var key = words.Where(x => x.IsKey == true);
Baru saja memposting penerapan metode ekstensi IndexWhere () saya (dengan pengujian unit):
http://snipplr.com/view/53625/linq-index-of-item--indexwhere/
Contoh penggunaan:
int index = myList.IndexWhere(item => item.Something == someOtherThing);
Solusi ini membantu saya lebih banyak, dari msdn microsoft :
var result = query.AsEnumerable().Select((x, index) =>
new { index,x.Id,x.FirstName});
query
adalah toList()
pertanyaan Anda .
int index = -1;
index = words.Any (word => { index++; return word.IsKey; }) ? index : -1;