Building int[] from values in another int[]

arrays, c#

Solution

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

This will get you the same array as you're getting now.

Here is the entire console application I used to prove it:

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();
    }
}

Both `building` and `newBuilding` provide you with the same output.

Problem

I have an `int[] building;` that I want to instantiate dynamically based on another array `int[] info;` The `info` will hold `int` ranging from 0-48 To build the `building` array.. If there is a non-zero value in the `info` array at index `ind` I want to add that index to the `building` array. So if `info` looks like this `{0, 12, 24, 48}` I'd like building to show `{1, 2, 3}` another example `{12, 0, 0, 48}` -> `{0, 3}` Is there a neat one liner to accomplish this? How I have been doing it ``` 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(); ```

Original source