Я использую класс Line в проекте VisualStudio C # от третьей стороны (нет доступа к источнику). Мой код генерирует сотни / тысячи строковых объектов, содержащих дубликаты, и мне нужно хранить их в какой-либо коллекции (СписокHashSet) для дальнейшей обработки (рисование на экране). Класс Line имеет свойства StartPoint и EndPoint типа Point и других. Для целей, которые мне нужны, ориентация линии не имеет значения, и если начальная и конечная точки одинаковы, два объекта Line одинаковы. Класс, который я использую, ведет себя по-разному, и два объекта Line считаются уникальными, даже если они имеют одинаковые начальные / конечные точки. (GetHashCode возвращает разные значения) Вопрос в том, как реализовать пользовательские процедуры IComparer или GetHashCode для стороннего класса, чтобы иметь возможность использовать структуру HashSet или функцию List.Distinct ()?
СпасибоИлиан и Хасан, которые сделали трюк Быстрый ответ на вопрос, если вы не возражаете: я не был уверен, использовать ли List или HashSet для хранения моих данных, поэтому я попробовал и рассчитал оба. Результаты показывают, что один на несколько порядков медленнее другого. Любое понимание того, что происходит?
class LineComparer : IEqualityComparer<Line>
{
public bool Equals(Line l1, Line l2)
{
if (l1.EndPoint == l2.EndPoint && l1.StartPoint == l2.StartPoint) return true;
if (l1.EndPoint == l2.StartPoint && l1.StartPoint == l2.EndPoint) return true;
return false;
}
public int GetHashCode(Line line) => line.StartPoint.GetHashCode() ^ line.EndPoint.GetHashCode();
}
, и это мой код для HashSet:
var timer = new Stopwatch();
timer.Start ();
var result =new HashSet (new LineComparer ());
GenerateAndStore20000Lines ();
timer.Stop ();Ed.WriteMessage ($ "\ nGenerated {result.Count} строк, время с хэш-набором: {timer.ElapsedMilliseconds}");
возврат результата;
Results: * Время с HashSet: 1302* Время с HashSet: 1328 * Время с HashSet: 1314 * Время с HashSet: 1311 * Время с HashSet: 1303
Код с List:
var timer = new Stopwatch ();timer.Start ();
var result = new List ();
GenerateAndStore20000Lines ();
timer.Stop ();Ed.WriteMessage ($ "\ nGenerated {result.Count} строк, время со списком: {timer.ElapsedMilliseconds}");
возвращать result.Distinct (new LineComparer ());
Результаты:
- Сгенерировано 20002 строки, время со списком: 26
- Сгенерировано 20002 строки, время со списком: 11
- Сгенерировано 20002 строки, время со списком: 14
- Сгенерировано 20002 строки, время со списком: 12
- Сгенерировано 20002 строки, время со списком: 12
(извините за плохое форматирование, но этот интерфейссводит меня с ума ... сдаюсь)