2015-03-10 4 views
0

Я реализовал код на C#, который сравнивает 2 символа строки по символу и возвращает процентное различие между двумя строками. Ниже приведен код.Сравнение строк в списке ссылочных типов

public static double percentage(string a, string b) 
    { 
     double percent; 

     if (a == b) //Same string, no iteration needed. 
      percent = 100; 
     if ((a.Length == 0) || (b.Length == 0)) //One is empty, second is not 
     { 
      percent = 0; 
     } 
     double maxLen = a.Length > b.Length ? a.Length : b.Length; 
     int minLen = a.Length < b.Length ? a.Length : b.Length; 
     int sameCharAtIndex = 0; 
     for (int i = 0; i < minLen; i++) //Compare char by char 
     { 
      if (a[i] == b[i]) 
      { 
       sameCharAtIndex++; 
      } 
     } 
     percent = sameCharAtIndex/maxLen * 100; 
     Console.WriteLine("Difference {0}", percent.ToString()); 
     return percent; 
     } 

У меня есть неправдоподобные данные из 2 таблицы в моей базе данных и хранятся данные в 2 списках ниже

   //ListOfPerson 
       while (reader.Read()) 
       { 
        //var person = new Person(); 
        person.ID = Convert.ToInt32(reader["ID"]); 
        person.firstName = reader["FirstName"].ToString(); 
        person.middleName = reader["MiddleName"].ToString(); 
        person.lastName = reader["LastName"].ToString(); 

        ListOfPerson.Add(person); 
        Console.WriteLine("{0} {1} {2} {3}", person.ID, person.firstName, person.middleName, person.lastName); 
       } 


       //ListOfEmployee 
       while (reader1.Read()) 
       { 
        //var employee = new Employee(); 

        employee.firstName = reader1["FirstName"].ToString(); 
        employee.lastName = reader1["LastName"].ToString(); 

        ListOfEmployee.Add(employee); 

        Console.WriteLine("{0} {1}", employee.firstName, employee.lastName); 
       } 

Я хочу сравнить person.firstName (во всем ListOfPerson) и employee.firstName (во всем ListOfEmployee) по характеру и получить процент. Я попытался сделать это:

   foreach (var p in ListOfPerson) 
       { 
        for (int i = 0; i < ListOfEmployee.Count(); i++) 
        { 
         clsCompare.percentage(p.firstName, ListOfEmployee[i].firstName); 
        } 
       } 

но его зацикливание только через фамилии в ListOfPerson и ListOfEmployee. Как я могу достичь этого? прокручивая все имена, сравнивая символ по символу в 2 списках.

+0

Уверены ли вы? Вы пробовали переходить с помощью контрольных точек или записывать имена тоже? Код, который у вас есть, должен проходить через все – Sayse

+0

Пока он должен перебираться, как вы записываете возвращаемое значение 'clsCompare.percentage (...)' ? –

+2

Почему 'var person = new Person();' прокомментировал? Без 'new Person()' вы просто составляете список, содержащий одно и то же лицо. Вот почему вы получаете только последнего человека. – bokibeg

ответ

1

Код недействителен. Добавьте операторы возврата следующим образом:

if (a == b) //Same string, no iteration needed. 
    return percent = 100; 
if ((a.Length == 0) || (b.Length == 0)) //One is empty, second is not 
{ 
    return percent = 0; 
} 

Заявления new требуются. Вы отметили их как комментарии. Без операторов new вы не выделяете новую память для новых значений. Вы сохраняете все значения в одном и том же объекте, тем самым перезаписывая предыдущие значения.

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

Смежные вопросы