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

时间:2010-11-20 10:37:44

标签: 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,因为它可能是在Where()子句之后得到过滤后的IEnumberable<string>的索引。如果我首先放置Select(),那么我所拥有的只是索引,不能按天来过滤。

我需要更改哪些内容才能使其正常工作并返回1,2,3

3 个答案:

答案 0 :(得分:36)

你可以这样做:

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

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

答案 1 :(得分:15)

Patko的回答是一般情况下的方法。

以下是另外两个选项:

// 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();

使用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();

答案 2 :(得分:-1)

这应该有效:

@SuppressWarnings("deprecation")
public class YourClassThatUsesHttpClient {
    ...
}