LINQ to find array indexes of a value

Solution 1:

.Select has a seldom-used overload that produces an index. You can use it like this:

str.Select((s, i) => new {i, s})
    .Where(t => t.s == "avg")
    .Select(t => t.i)
    .ToList()

The result will be a list containing 2 and 4.

Documentation here

Solution 2:

You can do it like this:

str.Select((v,i) => new {Index = i, Value = v}) // Pair up values and indexes
   .Where(p => p.Value == "avg") // Do the filtering
   .Select(p => p.Index); // Keep the index and drop the value

The key step is using the overload of Select that supplies the current index to your functor.