Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq选择特定索引处的数组值_C#_Linq - Fatal编程技术网

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确实(好吧,您需要“大”列表以查看任何差异,但“是”)。而且方法的目标也更明确!