Найти позицию элемента списка в списке на основе определенных критериев с помощью LINQ
Нечто похожее на linq находит, в каком положении находится мой объект в List, за исключением того, что его принятый ответ оценивается на уровне объекта.
Скажи у меня
public interface IFoo{
string text {get;set;}
int number {get;set;}
}
а также
public class Foo : IFoo{
public string text {get;set;}
public int number {get;set;}
}
Теперь у меня есть список коллекции IFoo
вот так:
public IList<IFoo> Foos;
Я хочу написать метод, который возвращает индекс (ы) Foos
на основе значения свойства и / или значений (например, text
или же number
в этом случае) так что я могу сделать что-то вроде:
var fooIndexes = Foos.GetIndexes( f => f.text == "foo" && f.number == 8 );
Как бы я это написал?
2 ответа
Решение
Вы можете использовать что-то вроде:
public static IEnumerable<int> GetIndices<T>(this IEnumerable<T> items, Func<T, bool> predicate)
{
return items.Select( (item, index) => new { Item = item, Index = index })
.Where(p => predicate(p.Item))
.Select(p => p.Index);
}
Вот реализация не-LINQ:
public static IEnumerable<int> GetIndexes<T>(this IEnumerable<T> items,
Func<T, bool> predicate)
{
int i = 0;
foreach (T item in items)
{
if (predicate(item))
yield return i;
i++;
}
}
В этом случае это, вероятно, будет более эффективным, поскольку позволяет избежать инициализации анонимного типа.