C# Linq选择特定索引处的数组值
我有这个方法:C# Linq选择特定索引处的数组值,c#,linq,C#,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 val
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]);
}
}
}
public void Foo(双[]值1,双[]值2,int[]索引)
{
var values1AtIndexes=新列表();
var values1NotAtIndexes=新列表();
var values2AtIndexes=新列表();
var values2NotAtIndexes=新列表();
对于(int i=0;i
我想知道是否有一种LINQ方法可以做到这一点?它看起来可能是这样的(不看性能)
所以我不确定它是否更短,或者更容易理解
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();
我认为除了可能有问题,因为不确定源数组中是否没有重复的双精度。我将把这标记为可接受的答案,但正如您所说的,从性能方面来说,我的方法可能会更好,因为我只迭代了1次而不是4次。@metacircle确实(好吧,您需要“大”列表以查看任何差异,但“是”)。而且方法的目标也更明确!