如何在使用Linq的Where子句后选择数组索引?

mik*_*kel 27 c# linq arrays

假设我有数组string[] weekDays = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };,我想找出包含's'的数组元素的索引.我怎么能用Linq做到这一点?

我已经尝试了int[] indexOfDaysContainingS = weekDays.Where(day => day.Contains("s")).Select((day, index) => index).ToArray();,但这0,1,2可能会返回,因为它可能是IEnumberable<string>在Where()子句之后得到过滤的索引.如果我首先放置Select(),那么我所拥有的只是索引,不能按天来过滤.

我需要改变什么来使其工作并返回1,2,3

Pat*_*tko 36

你可以这样做:

weekDays.Select((day, index) => new { Day = day, Index = index })
        .Where(x => x.Day.Contains("s"))
        .Select(x => x.Index)
        .ToArray();
Run Code Online (Sandbox Code Playgroud)

不确定这是否是最佳的..

  • @YonatanNir,“Select”有两个重载,其中一个还具有元素的索引作为参数,请参阅http://msdn.microsoft.com/en-us/library/bb534869.aspx。然后将该索引参数保存到一个匿名对象中,以便可以在第二个“Select”中再次使用它。我希望这回答了你的问题? (2认同)

Ani*_*Ani 15

帕特科的回答是一般情况下的方法.

这里有2个选项:

// Idea only works with collections that can be accessed quickly by index.
int[] indices = Enumerable.Range(0, weekDays.Length)
                          .Where(index => weekDays[index].Contains("s"))
                          .ToArray();
Run Code Online (Sandbox Code Playgroud)

使用MoreLinq:

// Similar to Patko's idea, except using a 'named' type.
int[] indices = weekDays.AsSmartEnumerable()
                        .Where(item => item.Value.Contains("s"))
                        .Select(item => item.Index)
                        .ToArray();
Run Code Online (Sandbox Code Playgroud)