类似于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;
我想编写一个方法,根据属性值和/或值(例如,Foos
或text
在这种情况下返回number
的索引)所以我可以这样做:
var fooIndexes = Foos.GetIndexes( f => f.text == "foo" && f.number == 8 );
我该怎么写?
答案 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++;
}
}
在这种情况下,这可能会更有效,因为它避免了匿名类型初始化。