【问题标题】:slicing array based on selection masks基于选择掩码的切片数组
【发布时间】:2012-05-17 10:07:54
【问题描述】:

给定两个数组:

double[] a = new double[]{1.0, 2.0, 3.0};
bool[] b = new bool[]{true, false, true};

有没有一种简单的方法可以根据ba 中进行选择?在 R 和其他脚本语言中,您会说:

a[b]

获取{1.0, 3.0}。我不知道在 C# 中是否有一种干净的(不涉及显式循环)方法来执行此操作。也许我应该以不同的方式组织我的数据?

【问题讨论】:

    标签: c# .net arrays linq


    【解决方案1】:

    使用 LINQ Zip 方法,例如:

    a.Zip(b, (i, j) => new {i, j}).Where(x => x.j).Select(x => x.i)
    

    【讨论】:

    • 不错的方法,不知道Zip方法。
    【解决方案2】:

    您可以使用 LINQ 实现此目的:

    double[] a = new double[]{1.0, 2.0, 3.0}; 
    bool[] b = new bool[]{true, false, true}; 
    var result = a.Where((item, index)=>b[index]);
    

    【讨论】:

    • 错误用法。条件在哪里?它只会在结果中给出 b 的副本。
    • @NikhilAgrawal,我已经更新了代码。感谢您指出错误。
    【解决方案3】:

    还有这种更传统的 LINQ 方法:

    b.Select((f, i) => f ? i : - 1).Where(i => i != -1).Select(i => a[i]);
    

    【讨论】:

      猜你喜欢
      • 2019-11-05
      • 2021-12-27
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2015-09-13
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多