【问题标题】:Select elements in an array where elements in another array are true选择一个数组中的元素,其中另一个数组中的元素为真
【发布时间】:2013-11-02 22:13:09
【问题描述】:

正如我在标题中所说:我需要在另一个数组中的元素为真的位置选择数组中的元素。我使用 Matlab 命令得到的结果相同:

output = array1(array2);

其中 array2 是一个布尔数组。

我现在迷失在 Linq 中 :)

【问题讨论】:

  • 例如,如果 array1 是 { "a", "b", "c" } 而 array2 是 { false, true, true },那么结果将是 { "b", "c" }?

标签: c# linq boolean


【解决方案1】:

试试这个:

var bools = new[] { true, false };
var elements = new[] { 1, 2 };
var result = elements
    .Take(bools.Length)
    .Where((e, index) => bools[index]).ToList();

Take 方法确保在bools 数组的索引范围内进行元素搜索。

【讨论】:

    【解决方案2】:

    对于一般情况,您可以编写自定义扩展方法 - 例如:

    public static IEnumerable<T> WhereEnabled<T>(
        this IEnumerable<T> source,
        IEnumerable<bool> flags)
    {
        using(var sourceIter = source.GetEnumerator())
        using(var flagIter = flags.GetEnumerator())
        {
            while(sourceIter.MoveNext() && flagIter.MoveNext())
            {
                if (flagIter.Current) yield return sourceIter.Current;
            }
        }
    }
    

    那么就:

    var enabled = array1.WhereEnabled(array2);
    

    也许与向量特化有关:

    public static IEnumerable<T> WhereEnabled<T>(
        this T[] source,
        bool[] flags)
    {
        int max = Math.Min(source.Length, flags.Length);
        for (int i = 0; i < max; i++ )
        {
            if (flags[i]) yield return source[i];
        }
    }
    

    【讨论】:

      【解决方案3】:

      Where 扩展方法的重载将 Func&lt;TSource, int, bool&gt; predicate 作为第二个参数。

      Func&lt;TSource, int, bool&gt; 中的int 参数是源的索引。

      output = array1.Where((x, index) => array2[index]);
      

      【讨论】:

      • 谢谢!最后需要一个 .toArray() :)
      • @Marco 如果你需要一个数组作为结果,是的 ;)
      猜你喜欢
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2022-07-06
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多