Linq在特定索引处选择数组值

时间:2013-12-17 14:25:46

标签: 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 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方式吗?

1 个答案:

答案 0 :(得分: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();