2013-12-17 41 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

它可能看起來像(不看perf)。

所以我不確定它更短,還是更容易理解。

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