Imagine I have file called `strings.dat`. Inside this file there are a lot of strings, for example: one million. **Strings are sorted**. Now I want to find a specified string, so I can write method like this: 

```
public long FindByName (string text)
{
  // ...
}

```

This method can return to me a position within a file where this string occurs. But iterating through lots of data is not efficient.
I can do some indexing system, like an `Dictionary<char, long>` which tells about at what position within file is placed first string with its value starting from given char.

Example: if I got 5 strings:
hello  

hello2  

world  

world2  

Zzz 

So my dictionary will be like:  

h 0  

w 2  

z 4 

But it's not efficient if I will have 1000 string with "d" char as first letter, and 10 million with "r" letter.

Do you know any good algorithms to achieve what I'm asking for?