Câu trả lời:
int keyIndex = Array.FindIndex(words, w => w.IsKey);
Điều đó thực sự mang lại cho bạn chỉ mục số nguyên chứ không phải đối tượng, bất kể bạn đã tạo lớp tùy chỉnh nào
System.Linq
theo mặc định? Đó là nơi mọi thứ khác như thế này là!
Đối với các mảng bạn có thể sử dụng
Array.FindIndex<T>
::
int keyIndex = Array.FindIndex(words, w => w.IsKey);
Đối với danh sách bạn có thể sử dụng List<T>.FindIndex
:
int keyIndex = words.FindIndex(w => w.IsKey);
Bạn cũng có thể viết một phương thức mở rộng chung phù hợp với bất kỳ 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;
}
Và bạn cũng có thể sử dụng 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();
Nếu bạn muốn tìm từ bạn có thể sử dụng
var word = words.Where(item => item.IsKey).First();
Điều này cung cấp cho bạn mục đầu tiên mà IsKey là đúng (nếu có thể không có, bạn có thể muốn sử dụng .FirstOrDefault()
Để có được cả mục và chỉ mục, bạn có thể sử dụng
KeyValuePair<WordType, int> word = words.Select((item, index) => new KeyValuePair<WordType, int>(item, index)).Where(item => item.Key.IsKey).First();
First
, nó có một vị từ, bạn không cần Where
.
Thử cái này...
var key = words.Where(x => x.IsKey == true);
Vừa đăng việc triển khai phương thức mở rộng IndexWhere () của tôi (với các bài kiểm tra đơn vị):
http://snipplr.com/view/53625/linq-index-of-item--indexwhere/
Ví dụ sử dụng:
int index = myList.IndexWhere(item => item.Something == someOtherThing);
Giải pháp này đã giúp tôi nhiều hơn, từ msdn microsoft :
var result = query.AsEnumerable().Select((x, index) =>
new { index,x.Id,x.FirstName});
query
là toList()
truy vấn của bạn .
int index = -1;
index = words.Any (word => { index++; return word.IsKey; }) ? index : -1;