Вы также можете написать общий метод расширения, который будет работать с любым 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;}
И вы также можете использовать LINQ:
int keyIndex = words
.Select((v, i)=>new{Word= v,Index= i}).FirstOrDefault(x => x.Word.IsKey)?.Index??-1;
+1 но что, если предмета не существует? получим 0, но индекс -1
Арсен Мкртчян
@ArsenMkrtchyan Если предмета не существует, появляются слова Длина
Джим Балтер
@ArsenMkrtchyan Вы написали "мы получим 0" ... это было неправильно. Вы написали «но индекс -1» ... это тоже неверно. -1 - обычный индикатор неудачи, но не единственно возможный. Подойдет любое значение вне 0..words.Length-1.
Джим Балтер,
1
@JimBalter, я имею в виду, что если элемент не существует, выражение вернет 0, что в нем не так? Я согласен с тем, что -1 - это общий индикатор, но согласен с тем, что очевидно, что в 99% случаев -1 - это ожидаемое значение, когда элемент не существует. по крайней мере 0 неверно, когда предмет не существует
Арсен Мкртчян
7
Если вы хотите найти слово, вы можете использовать
var word = words.Where(item => item.IsKey).First();
Это дает вам первый элемент, для которого IsKey истинно (если нет, вы можете использовать .FirstOrDefault()
Чтобы получить как элемент, так и индекс, вы можете использовать
KeyValuePair<WordType,int> word = words.Select((item, index)=>newKeyValuePair<WordType,int>(item, index)).Where(item => item.Key.IsKey).First();
Это кажется очень слабым решением по сравнению с ответами Grizzly и masenkablast. masenkablast отвечает на исходный вопрос, а Grizzly дает лучшее решение для поиска слова, поскольку его последняя «var» будет фактическим словом, а не IEnumerable <TSource>, содержащим 1 слово.
Джеймс
2
Только что опубликовал мою реализацию метода расширения IndexWhere () (с модульными тестами):
Ответы:
Это фактически дает вам целочисленный индекс, а не объект, независимо от того, какой пользовательский класс вы создали.
источник
System.Linq
по умолчанию в качестве метода расширения ? Вот где все такое!Для массивов вы можете использовать
Array.FindIndex<T>
:Для списков вы можете использовать
List<T>.FindIndex
:Вы также можете написать общий метод расширения, который будет работать с любым
Enumerable<T>
:И вы также можете использовать LINQ:
источник
источник
Если вы хотите найти слово, вы можете использовать
Это дает вам первый элемент, для которого IsKey истинно (если нет, вы можете использовать
.FirstOrDefault()
Чтобы получить как элемент, так и индекс, вы можете использовать
источник
First
, это требует предиката, вам не нуженWhere
.Попробуй это...
источник
Только что опубликовал мою реализацию метода расширения IndexWhere () (с модульными тестами):
http://snipplr.com/view/53625/linq-index-of-item--indexwhere/
Пример использования:
источник
Это решение помогло мне больше от msdn microsoft :
query
это вашtoList()
запрос.источник
источник