我有这个方法:
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方式吗?
答案 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();