Найти позицию элемента списка в списке на основе определенных критериев с помощью 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++;
    }
}

В этом случае это, вероятно, будет более эффективным, поскольку позволяет избежать инициализации анонимного типа.

Другие вопросы по тегам