Двоичный поиск в массиве для отображения строки строк в виде списка c# (Visual Studio) - PullRequest
0 голосов
/ 20 февраля 2020

Это изображение показывает, что происходит после ввода имени Смит и нажатия кнопки поиска У меня есть текстовый файл CSV, полный данных, которые загружаются в массив и отображаются в виде списка. Он имеет несколько столбцов и строк. Столбцы - это ext код, имя, фамилия. Каждая строка - это отдельная запись. Я создал текстовое поле, которое позволит пользователю вводить фамилию записи. Затем кнопка поиска позволит пользователю искать по фамилии добавочный номер. В идеале программа должна работать с несколькими сотрудниками с одинаковой фамилией и соответствовать только первой части фамилии; например, См для Смита и Смита. Основным требованием c является то, что поиск не учитывает регистр.

Необходимо использовать двоичный поиск. Есть два метода, которые я попробовал, однако я не совсем понимаю. Кнопка должна вызывать только функцию. Ниже я попробовал, но это не правильно. Помощь будет принята с благодарностью.

  private void searchName()
        {
            Array.Sort(partsTable, (x, y) => string.Compare(x.surname, y.surname));
            Clear();

            int nameIndex = binarySearch(partsTable, txtSurname.Text);

            ListViewItem phone = new ListViewItem();

            phone.Text = (Convert.ToString(partsTable[nameIndex].surname));
            phone.SubItems.Add(Convert.ToString(partsTable[nameIndex].forename));
            phone.SubItems.Add(Convert.ToString(partsTable[nameIndex].extensionCode));

            lstOutput.Items.Add(phone);
        }

          private int binarySearch(phone[] partsTable, string Key)
          {
            /* int left = 0;
              int right = partsTable.Length - 1;

              int nameIndex = -1;
              bool found = false;
              while (found != true && left <= right)
              {
                  int mid = (left + right) / 2;

                  if (string.Compare(partsTable[mid].surname, Key, true) == 0)
                  {
                      found = true;
                      nameIndex = mid;
                      MessageBox.Show("If 1");
                  }
                  else if (string.Compare(partsTable[mid].surname, Key, true) > 0)
                  {
                      right = mid;
                      MessageBox.Show("If 2");
                  }

                  else
                  {
                      left = mid;
                      MessageBox.Show("If 3");
                  }
              }
              return nameIndex;
          */
            /* while (left <= right)
             {

                 if (left > right)
                 {
                     MessageBox.Show("Search Failed");
                 }
                 else
                 {
                     int mid = (left + right) / 2;

                     if (Key == partsTable[mid].surname)
                         return mid;

                     else if (String.Compare(Key, partsTable[mid].surname) < 0)
                         right = mid - 1;

                     else
                         left = mid + 1;
                 }
             }
             return -2;
             */
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            string Key = txtSurname.Text;
            int answer = binarySearch(partsTable, Key);
            textBox1.Text = Convert.ToString(answer);
            if (answer >= -1)
            {

                string message = "Extension code already in use";
                string title = "Error";
                MessageBox.Show(message, title);
                extensionCode.Text = string.Empty;
                forename.Text = string.Empty;
                surname.Text = string.Empty;
                lstOutput.Items.Clear();

            }



        }

1 Ответ

0 голосов
/ 21 февраля 2020

Вот простая демонстрация, которая использует список для хранения временной переменной (данные таблицы). А затем используйте «do ... while» для просмотра списка.

private void btSearch_Click(object sender, EventArgs e)
{
    lstOutput.Items.Clear();
    do
    {
        searchName();
        if (index != -1)
        {
            people.RemoveAt(index);
        }
    }
    while (!isnull);
}

List<Person> people = new List<Person> {
    new Person { No = 1, Surname = "Smith"} ,
    new Person { No = 2, Surname = "Smit"},
    new Person { No = 3, Surname = "Bob"},
    new Person { No = 4, Surname = "KKK"},
    new Person { No = 5, Surname = "Obt"},
    new Person { No = 6, Surname = "Peter"}};

private void Form1_Load(object sender, EventArgs e)
{
    lstOutput.View = View.Details;
    people.Sort((x, y) => { return x.Surname.CompareTo(y.Surname); });
}

bool isnull = false;
int index;
private void searchName()
{
    index = BinarySearch(people, 0, people.Count, txtSurname.Text);

    if (index != -1)
    {

        ListViewItem phone = new ListViewItem();

        phone.Text = (Convert.ToString(people[index].No));
        phone.SubItems.Add(Convert.ToString(people[index].Surname));

        lstOutput.Items.Add(phone);
    }
    else
    {
        isnull = true;
    }
}

List<int> list = new List<int>();

private int BinarySearch(List<Person> p, int low, int high, string key)
{
    int mid = (low + high) / 2;
    if (low > high)
        return -1;
    else
    {
        try
        {
            string str = p[mid].Surname.Substring(0, key.Length);
            if (string.Compare(str, key) == 0)
                return mid;
            else if (string.Compare(str, key) > 0)
                return BinarySearch(p, low, mid - 1, key);
            else
                return BinarySearch(p, mid + 1, high, key);
        }
        catch
        {
            return -1;
        }
    }
}

class Person
{
    public int No { get; set; }
    public string Surname { get; set; }
}
...