15,125,104 members
See more:
I have a integer list
Dim list = {3,8,9,1,8,6,1}.tolist
I want select index of certain number. For example for 8, i want get of index numbers of 8s
in this example 1 and 4.

How can i write linq query for that? Thanks.

What I have tried:

```Dim list = {3,8,9,1,8,6,1}.tolist

Dim indexes = list.Where(Function(x) x = 8).Select(Function(x) list.IndexOf(8)).ToList()

After execute I got {1,1} but i want {1,4}```
Posted
Updated 11-Oct-21 14:18pm
v3
BillWoodruff 11-Oct-21 17:55pm

And, what happened when you tried that ?
gacar 11-Oct-21 18:56pm

I got {1,1}

## Solution 1

While you could use Linq (Select with Index parameter), in this case simple enumeration could be faster:
```List<int> list = new List<int>();
for (int i = 0; i < list.Count; i++)
{
}```
```Dim list As List(Of Integer) = New List(Of Integer)()
For i As Integer = 0 To list.Count - 1
If list(i) = 8 Then ndxmatches.Add(i)
Next```
v2
gacar 11-Oct-21 19:22pm

George Swan 12-Oct-21 9:33am

Here is the Linq query in C#
var indexes = list.Select((x, i) => i).Where((i)=>list[i]==8);
BillWoodruff 12-Oct-21 10:49am

Hi George, If you posted that as an answer, I'd upvote it :)

There are lots of ways to skin this cat:

var match8 = Enumerable.Range(0, list.Count)
Where(i => list[i] == 8);

My students have trouble "getting" Select with Index; they look at code that works, like yours, and ask: "why is the variable 'x' never used after the '=>' ?"

If I use Select with Index, I am creating an internal IEnumerable structure that will need to be evaluated to use its contents/data by calls to for/foreach/tolist, etc. In this case, the result i want is only the matching indexes, The Select statement in your code returns only an IEnumerable of indexes.

It seems simpler to use a for loop here, and, for me simpler is usually better. imho, Select with Index is a powerful tool for use when you wish to create more complex structures ... structures you will make full use of their internal data.

i stand ready to change my mind :)
George Swan 12-Oct-21 10:54am

BillWoodruff 12-Oct-21 11:47am

Hi, I think a range of answers is valuable for everyone in the long-run. cheers, Bill
gacar 12-Oct-21 18:27pm

And Congratulations Bill too, many thanks.
This is

var match8 = Enumerable.Range(0, list.Count)
Where(i => list[i] == 8);

worked too.
gacar 12-Oct-21 17:41pm

Congratulations George, many thanks.
This is
var indexes = list.Select((x, i) => i).Where((i)=>list[i]==8);
worked.