Двоичный поиск. Без прямого сравнения - C#
Формулировка задачи:
Помогите разобраться. Написал программу, в которой присутствует реализация алгоритма двоичного поиска . Поиск идёт без прямого сравнения ключа и элемента массива.
Дано: текстовый файл - students.txt Тип: <Фамилия> <Имя> <Дата рождения> <Возраст>.
1) Объявляю структуру с полями такими, как в файле. Успешно заношу всю информацию в структуру.
2) Написал бинарный поиск с аргументами (массив,левая,правая,ключ)
3) И когда пытаюсь внутри программы получить middle из функции , пишет нет перегрузки . Проблема в первом аргументе.
Помогите переделать! Пожалуйста.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BinSearch_1_
{
class Program
{
public static int BinSearch(string[] arr, int left, int right, string key)
{
int m = 0;
while (true)
{
m = (left + right) / 2;
if (arr[m].CompareTo(key) > 0) right = m - 1;
else if (arr[m].CompareTo(key) < 0) left = m + 1;
else
return m;
if (left > right)
return -1;
}
}
struct Infor
{
public string Family;
public string Name;
public string Year;
public string Age;
public void Info()
{
Console.WriteLine("Информация о студенте :{0} {1} год рождения {2} ,возраст {3}", Family, Name, Year, Age);
}
}
static void Main(string[] args)
{
string[] fileinfo = System.IO.File.ReadAllLines("students.txt", Encoding.GetEncoding(1251));
Infor[] info = new Infor[fileinfo.Length];
string[] words;
for (int i = 0; i < fileinfo.Length; i++)
{
words = fileinfo[i].Split(' ');
info[i].Family = words[0];
info[i].Name = words[1];
info[i].Year = words[2];
info[i].Age = words[3];
}
foreach (Infor s in info)
{
s.Info();
}
Console.WriteLine("------------------------------------------------------------------------------------");
Console.Write("Ищем студента с фамилией = "); string x = Console.ReadLine();
int left = 0;
int right = info.Length - 1;
int k = BinSearch(info[].Family,left,right,x);
}
}
}Решение задачи: «Двоичный поиск. Без прямого сравнения»
textual
Листинг программы
string[] familys = info.Select(inf=>inf.Family).ToArray(); //массив фамилий int k = BinSearch(familys, left, right, x);