Петля for
- самый быстрый способ.
Вы можете сделать это с помощью LINQ, но это будет медленнее. И хотя вы сами не пишете цикл, под капотом все еще есть цикл.
arr.SelectMany(x=>x).ToList()
. T[,]
вы можете просто сделать arr.ToList()
, поскольку IEnumerable<T>
из T[,]
возвращает все элементы в 2D-массиве. S> Похоже, что 2D-массив реализует только IEnumerable
, но не IEnumerable<T>
, так что вам нужно вставить Cast<double>
как еще один предложенный кодер. Это сделает его еще медленнее из-за бокса. Единственное, что может сделать код быстрее, чем простой цикл, - это вычислить количество элементов и построить список с правильной емкостью, поэтому его не нужно увеличивать.
Если ваш массив прямоугольный, вы можете получить размер как width*height
, с неровными массивами это может быть сложнее.
int width=1000;
int height=3000;
double[,] arr=new double[width,height];
List<double> list=new List<double>(width*height);
int size1=arr.GetLength(1);
int size0=arr.GetLength(0);
for(int i=0;i<size0;i++)
{
for(int j=0;j<size1;j++)
list.Add(arr[i,j]);
}
Теоретически может быть возможно использовать частное отражение и небезопасный код, чтобы сделать его немного быстрее, делая сырую копию памяти. Но я настоятельно советую против этого.
Если вы суммируете все возможные (или большинство) значений поля Subsid_Cde, то CASE будет быстрее, так как он не будет сканировать таблицу несколько раз, поскольку он агрегирует суммы. Если вы ищете только небольшое подмножество возможных полей Subsid_Cde, тогда отдельные выборки / объединения (вместе с индексом на Subsid_Cde) будут работать быстрее.
Вам нужно научиться читать планы выполнения, тогда вы сможете вычислить такие вещи самостоятельно.
Кроме того, в качестве альтернативы вы можете сделать GROUP BY для Subsid_Cde, заключенную в предложение PIVOT (Google для PIVOT MS SQL SERVER 2005)
3 - лучший вариант. Его легко читать, его легко изменить позже, и он должен использовать индексы, которые вы определили и ожидаете использовать (тем не менее, проверьте).
- 1 Иногда вам нужно присоединиться к той же таблице. Но это не одна из них, и присоединение каждый раз, когда вам нужно включить новый Subsid_Cde, делает SQL менее читаемым, не получая ничего особенного.
- 2 Таблицы транзакций имеют тенденцию становиться очень большими, поэтому вы НИКОГДА не хотите сканировать вся таблица. Итак, №2 определенно отсутствует, если только коды, которые вы будете использовать в своем запросе, все равно не вернут вам все строки.
Используйте это:
SELECT (
SELECT SUM(Trans_Amt)
FROM Transactions
WHERE Subsid_Cde = 'AA'
) AS sum_aa,
(
SELECT SUM(Trans_Amt)
FROM Transactions
WHERE Subsid_Cde = 'BB'
) AS sum_bb
, без внешнего FROM
или предложения WHERE
.
В SQL Server 2005+
, используйте это:
SELECT [AA], [BB]
FROM (
SELECT trans_amt, subsid_cde
FROM transactions
) q
PIVOT (
SUM(trans_amt)
FOR subsid_cde IN (['AA'], ['BB'])
)