Я бы пошел с:
Lead.where.not(phone: User.select(:phone))
Следующий код демонстрирует копирование 16 байтов (4 дюймов) из двумерного массива в одномерный массив.
int[,] oGridCells = {{1, 2}, {3, 4}};
int[] oResult = new int[4];
System.Buffer.BlockCopy(oGridCells, 0, oResult, 0, 16);
Вы также можете выборочно скопировать только одну строку из массива, предоставив правильные байтовые смещения. В этом примере копируется средняя строка 3-рядного двумерного массива.
int[,] oGridCells = {{1, 2}, {3, 4}, {5, 6}};
int[] oResult = new int[2];
System.Buffer.BlockCopy(oGridCells, 8, oResult, 0, 8);
Редактировать:
Я понял, что есть способ! Конечно, это того не стоит. Используйте небезопасный код . Полный пример, показывающий оба способа, с небезопасным ниже:
public class MultiSingleUnsafe
{
public static unsafe void Main(String[] a)
{
int rowCount = 6;
int iUpperBound = 10;
int [,] oGridCells = new int[rowCount, iUpperBound];
int iIndex = rowCount - 2; // Pick a row.
for(int i = 0; i < iUpperBound; i++)
{
oGridCells[iIndex, i] = i;
}
for (int iLoop = 0; iLoop < iUpperBound; iLoop++)
{
//Get the value from the 2D array
int iValue = oGridCells[iIndex, iLoop];
Console.WriteLine("Multi-dim array access iValue: " + iValue);
//Do something with iValue
}
fixed(int *lastRow = &(oGridCells[iIndex,0]))
{
for (int iLoop = 0; iLoop < iUpperBound; iLoop++)
{
int iValue = lastRow[iLoop];
Console.WriteLine("Pointer access iValue: " + iValue);
}
}
}
}
Я не знаю, как преобразовать многомерный массив в одномерный в C #. Конечно, вы можете создать новый одномерный массив и скопировать в него. Но я не думаю, что это даст выигрыш в производительности, даже если вы перебираете значения несколько раз. Как сказала Дарен, внутренне это все равно арифметика указателей. Если вы хотите быть уверенным, профилируйте его.
«Но если бы с массивом сильно манипулировали, то массив с одним измерением был бы более эффективен, чем массив с несколькими измерениями».
Я провел некоторое профилирование именно этим летом и был удивлен чтобы не видеть существенных различий в производительности между массивом 2D и 1D.
Я не тестировал производительность зубчатого массива.
Я был бы удивлен, если бы это было возможно: могу поспорить, oGridCells [iIndex, iLoop]
- это просто своего рода сокращение (внутренне, в MSIL) для oGridCells [iIndex * iLoop]
, и что многомерные массивы являются синтаксическим сахаром для этого.
Чтобы ответить на ваш вопрос: Нет. Вам придется зацикливать значения.