使用LINQ根据特定条件查找列表中列表项的位置

时间:2012-06-04 19:42:06

标签: c# linq linq-expressions

类似于linq find in which position is my object in 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;

我想编写一个方法,根据属性值和/或值(例如,Foostext在这种情况下返回number的索引)所以我可以这样做:

var fooIndexes = Foos.GetIndexes( f => f.text == "foo" && f.number == 8 );

我该怎么写?

2 个答案:

答案 0 :(得分:4)

您可以使用以下内容:

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);
}

答案 1 :(得分:1)

这是非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++;
    }
}

在这种情况下,这可能会更有效,因为它避免了匿名类型初始化。