2013-12-17 3 views
2

У меня есть этот метод:Linq Выбор значения массива в конкретных индексах

public void Foo(double[] values1, double[] values2, int[] indexes) 
{ 
    var values1AtIndexes = new List<double>(); 
    var values1NotAtIndexes = new List<double>(); 
    var values2AtIndexes = new List<double>(); 
    var values2NotAtIndexes = new List<double>(); 

    for (int i = 0; i < values1.Length; i++) 
    { 
     if (indexes.Contains(i)) 
     { 
      values1AtIndexes.Add(values1[i]); 
      values2AtIndexes.Add(values2[i]); 
     } 
     else 
     { 
      values1NotAtIndexes.Add(values1[i]); 
      values2NotAtIndexes.Add(values2[i]); 
     } 
    } 
} 

И мне было интересно, если есть LINQ-путь к этому?

ответ

6

Это может выглядеть так (не глядя на перфоманс).

Так что я не уверен, что это короче или проще понять.

values1AtIndexes = values1.Where((m, index) => indexes.Contains(index)).ToList(); 
values2AtIndexes = values2.Where((m, index) => indexes.Contains(index)).ToList(); 
//alternative 
values1AtIndexes = indexes.Select(m => values1[m]).ToList(); 
values1AtIndexes = indexes.Select(m => values2[m]).ToList(); 


//might be wrong if your lists contain duplicated values 
values1NotAtIndexes = values1.Except(values1AtIndexes).ToList(); 
values2NotAtIndexes = values2.Except(values2AtIndexes).ToList(); 

Как вы указали, Except может дать вам неправильные результаты, если у вас есть дубликаты.

Так что, если вы знаете, что вы можете иметь дубликаты, вы скорее должны сделать

values1NotAtIndexes = values1.Where((m, index) => !indexes.Contains(index)).ToList(); 
+0

Я думаю, что может быть проблемой с исключением, поскольку он не уверен, что нет повторяющихся двойников в исходных массивах. – metacircle

+0

@metacircle о, да, вы правы. –

+0

Я отмечу это как принятый ответ, но, как вы сказали, с точки зрения производительности мой подход, вероятно, будет лучше, потому что я только повторяю 1 раз, а не 4 раза. – metacircle

Смежные вопросы