У меня есть int[] building;, который я хочу создать динамически на основе другого массива int[] info;

info будет содержать int в диапазоне от 0 до 48

Чтобы построить массив building .. Если в массиве info есть ненулевое значение по индексу ind, я хочу добавить этот индекс в массив building.

Итак, если info выглядит так {0, 12, 24, 48}, я хотел бы построить, чтобы показать {1, 2, 3} другой пример {12, 0, 0, 48} -> {0, 3}

Есть ли один изящный лайнер для этого?

Как я это делал

int[] info = new int[]{12, 0, 0, 48};
List<int> indxs = new List<int>();
for (int i = 0; i < info.Length; i++)
    if (info [i] > 0)
        indxs.Add(i);
int[] building = indxs.ToArray();
4
AnotherUser 15 Май 2014 в 17:12

2 ответа

Лучший ответ
var building = info.Select((i, idx) => i == 0 ? -1 : idx)
                   .Where(i => i != -1)
                   .ToArray();

Это даст вам тот же массив, что и сейчас.

Вот полное консольное приложение, которое я использовал, чтобы доказать это:

class Program
{
    static void Main(string[] args)
    {
        int[] info = new int[] { 12, 0, 0, 48 };
        List<int> indxs = new List<int>();
        for (int i = 0; i < info.Length; i++)
            if (info[i] > 0)
                indxs.Add(i);
        int[] building = indxs.ToArray();

        var newBuilding = info.Select((i, idx) => i == 0 ? -1 : idx)
            .Where(i => i != -1)
            .ToArray();
    }
}

И building, и newBuilding предоставляют одинаковый результат.

4
Mike Perrenoud 15 Май 2014 в 13:23
var filtered = info.Select((x,i) => new { Value = x, Index = i})
                   .Where(x => x.Value > 0)
                   .ToArray();
2
leskovar 15 Май 2014 в 13:24