从另一个int[]中的值构建int[]

4
我有一个int[] building;数组,我想根据另一个int[] info;数组动态实例化它。 info中将包含从0到48的int
要构建building数组...如果info数组中索引ind处存在非零值,则要将该索引添加到building数组中。
因此,如果info看起来像这样{0, 12, 24, 48},我希望building显示{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();

2
你正在使用的语言不是C++,但问题被标记为C++。请解决这个不一致性。调整标签或示例中的任意一个。 - Cheers and hth. - Alf
你可以编写一个辅助函数,比如 IndexesWhere,类似于 System.Linq.Enumerable.Where - ach
1
你想让它成为一行代码有特别的原因吗?你可以在一个实用库中创建一个方法,或者更好的是使用扩展方法。你应该始终重视可读性而不是长度。 - mason
@mason 并没有特别要求,当性能不是太大问题时,我喜欢让我的代码看起来漂亮。// 我喜欢扩展方法的想法。我可以把所有的“混乱”都推到一个类中,让我的其余代码看起来漂亮。 - AnotherUser
一行代码并不一定能让代码看起来好看。当然,在某些情况下,你可以使用Linq或Lambda编写非常易读的一行代码。但是,为了节省空间而试图将其变成一行代码是一个坏主意。 - mason
2个回答

4
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,它们都提供相同的输出结果。


2
var filtered = info.Select((x,i) => new { Value = x, Index = i})
                   .Where(x => x.Value > 0)
                   .ToArray();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接