willington.d Ответов: 3

Две размерные группы массив или список


Дорогие все,

У меня есть следующий двумерный массив:

object[,] cellValues


[1,1] = "х"
[1,2] = "г"
[1,3] = "з"

[2,1] = " а"
[2,2] = "б"
[2,3] = "с"

[3,1] = "я"
[3,2] = "ж"
[3,3] = "к"

[4,1] = "Р"
[4,2] = "вопрос"
[4,3] = "Р"

[5,1] = " м"
[5,2] = "Н"
[5,3] = "о"

Теперь я пытаюсь преобразовать вышеприведенный двумерный массив в словарь или список:

1 [x, y, z]
2 [a, b, c]
3 [i, j, k]
4 [p, q,r]
5 [m, n, o]

Как это сделать с помощью LINQ, так как для/foreach требуется много времени, чтобы завершить это?
Обратите внимание,что двумерный массив содержит 513360 значений.

Что я уже пробовал:

var xLimit = Enumerable.Range(0, cellValues.GetUpperBound(0) + 1); 
var yLimit = Enumerable.Range(0, cellValues.GetUpperBound(1) + 1);
var result = xLimit.SelectMany(x => yLimit.Select(y => cellValues[x, y]));

3 Ответов

Рейтинг:
2

OriginalGriff

Linq, вероятно, не ускорит это: он не удаляет цикл, он просто скрывает и откладывает его до тех пор, пока вам не понадобятся результаты, после чего он будет оценен.

Вместо этого посмотрите на использование Параллельно.Для[^] для вашего внешнего цикла, и это "побудит" ваш компьютер использовать несколько ядер. Это может значительно сократить время, необходимое для его обработки. Или это может сделать его еще хуже из-за настройки потока и накладных расходов на переключение. В этом случае разделите свой цикл на несколько секций (по одной на ядро в вашем целевом ПК) и сделайте это "кусками", а затем соберите куски по завершении.


Рейтинг:
2

#realJSOP

Вот кое-что, что может сработать. Не использует LINQ, так что это должно быть быстрее.

public class Model
{
    public List<string> Values { get; set; }
}

string[,] parts = new string[,] {{"a","b","c"},{"d","e","f"}};
List<Model> list = new List<Model>();

//find out how big our array is
int dim1 = parts.GetLength(0);
int dim2 = parts.GetLength(1);

for (int i = 0; i < dim1; i++)
{
    List<string> values = new List<string>();
    for (int j = 0; j < dim2; j++)
    {
        values.Add(parts[i,j]);
    }
    list.Add(new Model(){ Values = values });
}


Рейтинг:
0

Bilgehan Berberoğlu

Вы можете использовать метод AsParallel (), который поможет выполнить линейный запрос как параллельный.

var xLimit = Enumerable.Range(0, cellValues.GetUpperBound(0) + 1); 
var yLimit = Enumerable.Range(0, cellValues.GetUpperBound(1) + 1);
var result = xLimit.AsParallel().SelectMany(x => yLimit.AsParallel().Select(y => cellValues[x, y]));

более подробный ; https://msdn.microsoft.com/tr-tr/library/system.linq.parallelenumerable.asparallel(v=против 110). aspx[^]