Нет такого интерфейса.Поэтому вам нужно создать свой собственный, например:
public interface IMatrix<T>
{
int Rows { get; }
int Columns { get; }
ref T this[int row, int column] { get; }
}
и дополнительно реализовать его в ваших классах коллекций, создать адаптер для массивов ( Pattern Adapter ).
Я знаю, я знаю, вы сказали
Мне также нужно избегать выделения памяти, поэтому создание какого-либо класса-оболочки для массивов недопустимо.
Я не думаю, что крошечный недолговечный объект-оболочка поколения GC3 повредит вашей системе, но в любом случае можно избежать выделения кучи, реализовав оболочку как struct
:
public struct ArrayMatrix<T> : IMatrix<T>
{
readonly T[,] source;
public ArrayMatrix(T[,] source) => this.source = source;
public int Rows => source.GetLength(0);
public int Columns => source.GetLength(1);
public ref T this[int row, int column] => ref source[row, column];
}
иделая ваш метод generic (чтобы избежать блокировки struct
):
public static void RemainingDegreeDistribution<TMatrix>(IGraph graph, TMatrix distArr)
where TMatrix : IMatrix<float>
{
int total = 0;
for (int i = 0; i < graph.Edges.Count; i++)
{
int startRemDeg = graph.Edges[i].Start.RemDeg;
int endRemDeg = graph.Edges[i].End.RemDeg;
distArr[startRemDeg, endRemDeg]++;
distArr[endRemDeg, startRemDeg]++;
total = total + 2;
}
for (int i = 0; i < distArr.Rows; i++)
{
for (int j = 0; j < distArr.Columns; j++)
{
distArr[i, j] /= total;
}
}
}
Чтобы упростить использование с массивами, вы можете добавить вспомогательный метод:
public static class ArrayMatrix
{
public static ArrayMatrix<T> ToMatrix<T>(this T[,] source) => new ArrayMatrix<T>(source);
}
и даже обеспечивают перегрузку вашего метода аргументом массива:
public static void RemainingDegreeDistribution(IGraph graph, float[,] distArr)
=> RemainingDegreeDistribution(graph, distArr.ToMatrix());