Is there a way to capture the index value in the LINQ Where method in C #?

My next C # code is obviously hacked, so how can I grab the index value in the Where method?

string[] IntArray = { "a", "b", "c", "b", "b"}; int index=0; var query = IntArray.Where((s,i) => (s=="b")&((index=i)==i)); //"&" and "==i" only exists to return a bool after the assignment ofindex foreach (string s in query) { Console.WriteLine("{0} is the original index of {1}", index, s); } //outputs... //1 is the original index of b //3 is the original index of b //4 is the original index of b 
+6
c # linq
source share
3 answers

The Where method only returns whether the element should be included in the result or not. A function cannot provide more information in a reasonable way (it can capture a local variable and do something like this with it, but that would be awful).

If you need an index in the end result, you need to create a projection that includes this index. If you want the original index to be the final result, you need to put this projection in front of any Where clauses.

Here is an example of this:

 using System; using System.Collections.Generic; using System.Linq; public class Test { static void Main() { IEnumerable<char> letters = "aBCdEFghIJklMNopQRsTUvWyXZ"; var query = letters.Select((c, i) => new { Char=c, OriginalIndex=i }) .Where(x => char.IsLower(x.Char)) .Select((x, i) => new { x.Char, x.OriginalIndex, FinalIndex=i}); foreach (var result in query) { Console.WriteLine(result); } } } 

Results:

 { Char = a, OriginalIndex = 0, FinalIndex = 0 } { Char = d, OriginalIndex = 3, FinalIndex = 1 } { Char = g, OriginalIndex = 6, FinalIndex = 2 } { Char = h, OriginalIndex = 7, FinalIndex = 3 } { Char = k, OriginalIndex = 10, FinalIndex = 4 } { Char = l, OriginalIndex = 11, FinalIndex = 5 } { Char = o, OriginalIndex = 14, FinalIndex = 6 } { Char = p, OriginalIndex = 15, FinalIndex = 7 } { Char = s, OriginalIndex = 18, FinalIndex = 8 } { Char = v, OriginalIndex = 21, FinalIndex = 9 } { Char = y, OriginalIndex = 23, FinalIndex = 10 } 
+4
source share

Which index do you want? You have three times b. If you need all indices b, then:

  string[] IntArray = { "a", "b", "c", "b", "b" }; var query = IntArray .Select((x, i) => new { value = x, idx = i }) .Where(s => s.value == "b"); 
+3
source share

Your current code captures the last index "b" in the variable index . To reproduce your functionality with LINQ, use:

 int index = IntArray.LastOrDefault(s => s == "b"); 

I do not know if you really need it.

0
source share

All Articles