Учитывая, что массив отсортирован в лексическом порядке, у вас есть две опции:
- Написать собственный метод двоичного поиска, который работает с двумерным массивом.
- Написатьструктура, которая хранит пару целых чисел и реализует
IComparable<T>
и IEquatable<T>
Я бы выбрал второй вариант.Базовая реализация для такой структуры была бы:
public struct Pair : IComparable<Pair>, IEquatable<Pair>
{
private readonly int x;
private readonly int y;
public Pair(int x, int y)
{
this.x = x;
this.y = y;
}
public int X { get { return x; } }
public int Y { get { return y; } }
public int CompareTo(Pair other)
{
return (x == other.x) ? y.CompareTo(other.y) : x.CompareTo(other.x);
}
public bool Equals(Pair other)
{
return x == other.x && y == other.y;
}
}
Теперь вы можете использовать метод Array.BinarySearch
:
var pairs = new[] {new Pair(1, 1), new Pair(1,2), new Pair(1, 3), new Pair(2, 3), new Pair(2, 4)};
// Returns 2
int index1 = Array.BinarySearch(pairs, new Pair(1,3));
// No match. Returns a negative number.
int index2 = Array.BinarySearch(pairs, new Pair(1, 4));