过滤两个数组以避免Inf/NaN值

Gac*_*cek 6 c# linq lambda

我有两个相同大小的双精度数组,包含一些情节的X和Y值.

我需要创建一些针对INF/NaN值的保护.我需要找到所有的值对(X,Y),其中X和Y都不是INF也不是NaN

如果我有一个数组,我可以使用lambdas:

var filteredValues = someValues.Where(d=> !(double.IsNaN(d) || double.IsInfinity(d))).ToList();
Run Code Online (Sandbox Code Playgroud)

现在,对于两个数组,我使用以下循环:

List<double> filteredX=new List<double>();
List<double> filteredY=new List<double>();

for(int i=0;i<XValues.Count;i++)
{
   if(!double.IsNan(XValues[i]) &&
         !double.IsInfinity(XValues[i]) &&
         !double.IsNan(YValues[i]) &&
         !double.IsInfinity(YValues[i]) )
     {
       filteredX.Add(XValues[i]);
       filteredY.Add(YValues[i]);
     }
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以使用LINQ/lambdas同时过滤两个数组,就像单个数组一样?

不幸的是我只能使用.NET 3.5.

Jon*_*eet 6

Mark的原始答案略有修正:

var filteredValues = XValues.Zip(YValues, (x,y) => new { x, y })
        .Where(p => !(double.IsNan(p.x) || double.IsNan(p.y) || 
                      double.IsInfinity(p.x) || double.IsInfinity(p.y)))
        .ToList();
Run Code Online (Sandbox Code Playgroud)

或者,您可能想要使它更整洁:

Func<double, bool> valid = z => !double.IsNan(z) && !double.IsInfinity(z);
var filteredValues = XValues.Zip(YValues, (x,y) => new { x, y })
        .Where(p => valid(p.x) && valid(p.y))
        .ToList();
Run Code Online (Sandbox Code Playgroud)

如果您需要将结果返回到两个列表中,您可以执行以下操作:

var filteredX = filteredValues.Select(p => p.x).ToList();
var filteredY = filteredValues.Select(p => p.y).ToList();
Run Code Online (Sandbox Code Playgroud)