Реализация GetHashCode на основе строки подключения - PullRequest
1 голос
/ 10 августа 2010

У меня возникают трудности с соблюдением всех правил для метода GetHashCode в MSDN для класса, единственным свойством которого является строка подключения.

Я попытался просто вернуть хэш строки, но это возвращает другое значение для строк Provider=Microsoft.ACE.OLEDB.12.0; Data Source=path, Provider=Microsoft.ACE.OLEDB.12.0; Data Source=path; и Data Source=path;Provider=Microsoft.ACE.OLEDB.12.0;, все из которых эквивалентны.

Затем я попытался использовать метод OleDbConnectionStringBuilder.GetHashCode, но в этом случае он даже не возвращает тот же HashCode:

test1.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" +
        PathToExcelFile + ";Extended Properties='Excel 12.0 Macro;HDR=YES;IMEX=1';";
test2.ConnectionString = test1.ConnectionString;

Console.WriteLine(test1.GetHashCode());
Console.WriteLine(test2.GetHashCode());

Моя цель - использовать мой класс в качестве ключа к словарю, поэтому GetHashCode очень важен. Как мне его реализовать?

Ответы [ 3 ]

2 голосов
/ 10 августа 2010

Определите каноническую строку подключения и вызовите GetHashCode для этой строки. В этом случае вы можете определить «Provider = Microsoft.ACE.OLEDB.12.0; Data Source = path» в качестве вашей канонической формы, а затем вам потребуется преобразовать все эквивалентные строки подключения в каноническую строку и затем вызвать GetHashCode.

Тогда возникает вопрос: насколько сложно превратить все эквивалентные строки подключения в одну строку?

0 голосов
/ 16 августа 2010

Я решил эту проблему на основе ввода из обоих ответов:

Определение канонической строки соединения

И

Если тольковы используете класс, который определяет каждый конкретный компонент строки подключения, вам не нужно решать, равны ли две строки подключения, кроме сравнения строк.

Итак, я создал метод расширения для OleDbConnectionStringBuilder:

public static int GetRealHashCode(this OleDbConnectionStringBuilder target)
{
    int ToReturn = 17;
    ToReturn *= target.DataSource.TrimEnd(';').GetHashCode();
    ToReturn *= target.Provider.TrimEnd(';').GetHashCode();
    ToReturn *= target.PersistSecurityInfo.ToString().GetHashCode();

    var OrderedKeys = from string key in target.Keys
              orderby key
              select key;
    foreach (string Key in OrderedKeys)
        ToReturn *= target[Key].GetHashCode();

    return ToReturn;
}
0 голосов
/ 10 августа 2010

Очень сложно, если не невозможно, определить, равны ли строки подключения.Единственное допущение, которое вы можете сделать, состоит в том, что если строки равны, строки подключения:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...