2013-10-24 128 views
1

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

output = array1(array2); 

其中array2是一个布尔数组。

我此刻:)

+0

因此,例如,如果array1是“{”a“,”b“, “c”}'array2是'{false,true,true}'结果是'{“b”,“c”}'? – BoltClock

回答

5

有一个Where扩展方法的超负荷作为第二个参数Func<TSource, int, bool> predicate

中的参数是源的索引。

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

谢谢!它需要一个.toArray()结尾:) – Marco

+1

@Marco如果你需要一个数组作为结果,是的;) –

3

失去Linq中试试这个:

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

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

1

对于一般情况下,你可以写一个自定义的扩展方法 - 例如:

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]; 
    } 
} 
相关问题