12

I have the following code:

 var accidents = text.Skip(NumberOfAccidentsLine + 1).Take(numberOfAccidentsInFile).ToArray();

where accidents is an array of strings.

I want to make a Linq transformation from the string array to an array of Accident objects as follows:

 return accidents.Select(t => new Accident() {Id = i, Name = t.Replace("\"", string.Empty)}).ToArray();

How do I retrieve the index i from the accidents array using Linq or do I have to go old school?

Klaus Nji
  • 18,107
  • 29
  • 105
  • 185
  • 2
    Do you want the index from the `accidents` array itself, or the index from the original `text` enumeration? If the former, then Marcin's answer is fine. If the latter, then you will need to do the `Skip()` and `Take()` _after_ the initial `Select()` where the index is introduced. – Peter Duniho Dec 04 '14 at 02:12

3 Answers3

24

I'm not sure what kind of index you're looking for, but if it's just set of consecutive numbers then you're lucky. There is Select overload that does exactly that:

return accidents.Select((t, i) => new Accident() {Id = i, Name = t.Replace("\"", string.Empty)}).ToArray();

It expects a delegate that takes two parameters - the item and its index.

MarcinJuraszek
  • 124,003
  • 15
  • 196
  • 263
2

Use Enumerable.Range to generate the ID values and then use the current value to index into your String Array:

Enumerable.Range(0, accidents.Length).Select(f => new Accident() { Id = f, Name = accidents[f] })
Mike Burdick
  • 838
  • 6
  • 5
0

May be this LINQ query will help you to find The formated name with Index:

var accidents=(from acc in accidents
    select new {
        id=accidents.IndexOf(acc),
        Name = acc.Replace("\"", string.Empty)
    }).ToArray()

or you can also use .ToList() for the case if you want result to be in IEnumerable format.

Rahul
  • 2,309
  • 6
  • 33
  • 60