Список<T>.BinarySearch, возвращающий неожиданный результат
Я получаю странный результат от List.BinarySearch в одном случае. При поиске "$in" в списке, где присутствует "$in", результат равен -4. Ниже приведен тестовый пример, который освещает проблему. Только случай поиска "$in" терпит неудачу.
Это может быть какое-то зарезервированное ключевое слово? Я скомпилировал против.Net Framworks 3.5, 4.5.2 и 4.6 с тем же результатом.
[TestMethod]
public void IssueWithBinarySearch() {
List<string> operators = new List<string>( new[] { "$eq", "$gt", "$gte", "$lt", "$lte", "$ne", "$in", "$nin" } );
Assert.AreEqual( 0, operators.BinarySearch( "$eq" ) );
Assert.AreEqual( 1, operators.BinarySearch( "$gt" ) );
Assert.AreEqual( 2, operators.BinarySearch( "$gte" ) );
Assert.AreEqual( 3, operators.BinarySearch( "$lt" ) );
Assert.AreEqual( 4, operators.BinarySearch( "$lte" ) );
Assert.AreEqual( 5, operators.BinarySearch( "$ne" ) );
Assert.AreEqual( 6, operators.BinarySearch( "$in" ) );
Assert.AreEqual( 7, operators.BinarySearch( "$nin" ) );
}
1 ответ
Решение
Бинарный поиск корректно работает только с отсортированным списком. List<T>
должны быть уже отсортированы; в противном случае результат неверен.