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次呢?