选择一个数组中的元素,其中另一个数组中的元素为真

本文关键字:元素 数组 另一个 选择 一个 | 更新日期: 2023-09-27 18:36:37

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

output = array1(array2);

其中 array2 是一个布尔数组。

我现在迷失在林克:)

选择一个数组中的元素,其中另一个数组中的元素为真

Where 扩展方法的重载将Func<TSource, int, bool> predicate作为第二个参数。

Func<TSource, int, bool>中的int参数是源的索引。

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

试试这个:

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

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

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

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];
    }
}