C# 使用LINQ返回与条件匹配的数组索引的干净方法
我想返回满足条件的数组中的所有索引。我想出了一个好主意C# 使用LINQ返回与条件匹配的数组索引的干净方法,c#,linq,C#,Linq,我想返回满足条件的数组中的所有索引。我想出了一个好主意 myarray .Select((p,i) => { if (SomeCondition(p)) return i; else return -1; }) .Where(p => p != -1); 我知道我可以编写一个扩展方法或使用循环来实现它,但我想知道LINQ中是否有我不熟悉的东西。道歉如果这是琐碎的就我个人而
myarray
.Select((p,i) =>
{
if (SomeCondition(p)) return i;
else return -1;
})
.Where(p => p != -1);
我知道我可以编写一个扩展方法或使用循环来实现它,但我想知道LINQ中是否有我不熟悉的东西。道歉如果这是琐碎的就我个人而言,我会这么说:
myarray
.Select((p, i) => new { Item = p, Index = i })
.Where(p => SomeCondition(p.Item))
.Select(p => p.Index);
我可能会写一个扩展方法,但如果我选择不写,我会这样做:
array
.Select((item, index) => SomeCondition(item) ? index : -1)
.Where(index => index != -1);
这正是您已经在做的事情,但不太详细,因为它使用了三元if运算符,而不是
if
/else
块。当我阅读问题文本而不是示例时:
int[] data = { 1, 2, 5, 6, };
var results = Enumerable.Range(0, data.Length).Where(i => data[i] > 2);
// results = { 2, 3 }
你真的需要那些
-1
s吗?不,我根本不需要它们,我只需要在select之后在查询中筛选一些东西,因为这只是项目。非常聪明的解决方案Btwpersonal我更喜欢Kirk的解决方案-当你有一个可以在任何序列上工作的解决方案时,为什么要限制你自己使用数组呢?我想出了相同的代码。但是我不喜欢“myarray”被遍历3次。@hIpPy,这实际上并没有遍历数组3次。您应该进一步研究的实现。选择和。其中。有些操作符确实遍历整个序列(例如,.OrderBy
),但可以合并的操作符(如投影和过滤器)比您直观的效率更高。我在选择和Where
扩展方法中看到了foreach
。它怎么不经过3次呢?