Что лучший способ состоит в том, чтобы извлечь одномерный массив из прямоугольной антенной решетки в C#?

Удаление -d из Шебанга решает эту проблему. Слава Кориону за ответ.

12
задан kdbanman 1 October 2015 в 16:28
поделиться

5 ответов

Для прямоугольной антенной решетки:

string[,] rectArray = new string[3,3] { 
    {"a", "b", "c"}, 
    {"d", "e", "f"}, 
    {"g", "h", "i"} };

var rectResult = rectArray.Cast<object>().ToArray();

И для зубчатого массива:

string[][] jaggedArray =  { 
    new string[] {"a", "b", "c", "d"}, 
    new string[] {"e", "f"}, 
    new string[] {"g", "h", "i"} };

var jaggedResult = jaggedArray.SelectMany(s => s).Cast<object>().ToArray();
7
ответ дан 2 December 2019 в 05:56
поделиться

Строки могут быть скопированы легко с помощью Массива. Копия:

        int[][] arDouble = new int[2][];
        arDouble[0] = new int[2];
        arDouble[1] = new int[2];
        arDouble[0][0] = 1;
        arDouble[0][1] = 2;
        arDouble[1][0] = 3;
        arDouble[1][1] = 4;

        int[] arSingle = new int[arDouble[0].Length];

        Array.Copy(arDouble[0], arSingle, arDouble[0].Length);

Это скопирует первую строку в единственный массив Размера.

1
ответ дан 2 December 2019 в 05:56
поделиться

LINQ является ответом

static object[] GetColumn(string[][] source, int col) {
    return source.Iterate().Select(x => source[x.Index][col]).Cast<object>().ToArray();
}
static object[] GetRow(string[][] source, int row) {
    return source.Skip(row).First().Cast<object>().ToArray();
}
public class Pair<T> {
    public int Index;
    public T Value;
    public Pair(int i, T v) {
        Index = i;
        Value = v;
    }
}
static IEnumerable<Pair<T>> Iterate<T>(this IEnumerable<T> source) {
    int index = 0;
    foreach (var cur in source) {
        yield return new Pair<T>(index, cur);
        index++;
    }
}
1
ответ дан 2 December 2019 в 05:56
поделиться

Можно бросить массив строк к объектному массиву тривиально - хождение другим путем не работает. Фактическое извлечение должно использовать для цикла, хотя, насколько я вижу: Array.Copy требует, чтобы входные и выходные разряды были тем же, и Buffer.BlockCopy только работы для значения вводят массивы. Это действительно кажется нечетным хотя...

Можно использовать LINQ для дополнительного строка или столбец в отдельном операторе, хотя это будет неэффективно (поскольку это создаст список внутренне, затем иметь для преобразования его в массив - если Вы сделаете это сами, можно предварительно выделить массив правильному размеру и скопировать непосредственно).

Копирование строки (rowNum строка должна быть скопирована):

object[] row = Enumerable.Range(0, rowLength)
                         .Select(colNum => (object) stringArray[rowNum, colNum])
                         .ToArray();

Копирование столбца (colNum столбец должен быть скопирован):

object[] column = Enumerable.Range(0, columnLength)
                            .Select(rowNum => (object) stringArray[rowNum, colNum])
                            .ToArray();

Я не уверен, что это действительно немного лучше/более просто, чем цикл foreach, хотя - особенно, если Вы пишете ExtractRow метод и ExtractColumn метод и повторное использование их.

13
ответ дан 2 December 2019 в 05:56
поделиться

Я был бы точно так же, как для разъяснения (учитывая пример и что спрашивают).

Зубчатый массив является массивом массивов и объявляется как так:

string[][] data = new string[3][];
data[0] = new string[] { "0,[0]", "0,[1]", "0,[2]" };
data[1] = new string[] { "1,[0]", "1,[1]", "1,[2]" ];
data[2] = new string[] { "2,[0]", "1,[1]", "1,[2]" };

По сравнению с прямоугольной антенной решеткой, определяемой как единый массив, который содержит несколько размеров:

string[,] data = new string[3,3];
data[0,0] = "0,0";
data[0,1] = "0,1";
data[0,2] = "0,2";
...etc

Из-за этого зубчатый массив является IQueryable/IEnumerable, потому что можно выполнить итерации по нему для получения массива при каждом повторении. Принимая во внимание, что прямоугольная антенная решетка не является IQueryable/IEnumerable, потому что элементы обращены в полном размере (0,0 0,1.. и т.д.), таким образом, у Вас не будет способности использовать Linq или любые предопределенные функции, созданные для Массива в этом случае.

Хотя можно выполнить итерации по массиву однажды (и достигнуть того, что Вы хотите) как это:

/// INPUT: rowIndex, OUTPUT: An object[] of data for that row
int colLength = stringArray.GetLength(1);
object[] rowData = new object[colLength];
for (int col = 0; col < colLength; col++) {
    rowData[col] = stringArray[rowIndex, col] as object;
}
return rowData;

/// INPUT: colIndex, OUTPUT: An object[] of data for that column
int rowLength = stringArray.GetLength(0);
object[] colData = new object[rowLength];
for (int row = 0; r < rowLength; row++) {
    colData[row] = stringArray[row, colIndex] as object;
}
return colData;

Надежда это помогает :)

4
ответ дан 2 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: