如何在LINQ中处理并行数组?

时间:2017-05-23 02:21:05

标签: c# linq

我有两个独立的阵列(来自Json,但这并不重要)。它们排成一列......即arr1 [1]与arr2 [1]一起使用。

我想创建一个包含几个捕获的Test对象列表:

1) both arr1 and arr2 value can't be null
2) I'm only interested in indexes where the arr1 element is a multiple of 5

这是我到目前为止所做的:

class Test
{
    public double d1;
    public double d2;
}

class Program
{
    static void Main(string[] args)
    {
        string[] arr1 = new string[] { "0", "2", "5", "7", "10", "11", null, "13", "15" };
        string[] arr2 = new string[] { "11", "13", "56", "8", null, "44", "55", "66", "77" };

        var v = arr1.Where(x => !String.IsNullOrEmpty(x)).Select(x => Double.Parse(x)).Where(x => (x % 5) == 0).Select((x, y) => new Test
        {
            d1 = x,
            d2 = Double.Parse(arr2[y])
        });
    }
}

我不知道如何跳过arr2为空的那些并且对齐方式变得混乱。

2 个答案:

答案 0 :(得分:4)

为了不弄乱对齐,你应该先.Zip这两个数组。然后,如果我理解正确,那么应该跳过那些在任一数组中具有null值的索引,因此您使用.Where过滤掉那些,然后执行其余逻辑。

class Test
{
    public double d1;
    public double d2;
}

class Program
{
    static void Main(string[] args)
    {
        string[] arr1 = new string[] { "0", "2", "5", "7", "10", "11", null, "13", "15" };
        string[] arr2 = new string[] { "11", "13", "56", "8", null, "44", "55", "66", "77" };

        var v = arr1
            .Zip(arr2, (x, y) => new {x, y})
            .Where(a => !string.IsNullOrEmpty(a.x) && !string.IsNullOrEmpty(a.y))
            .Select(a => new Test { d1 = double.Parse(a.x), d2 = double.Parse(a.y) })
            .Where(a => (a.d1 % 5) == 0);

       // TODO, ready to enumerate over v.
    }
}

答案 1 :(得分:0)

您可以按以下条件过滤条件。

 class Program
    {
        static void Main(string[] args)
        {
            string[] arr1 = new string[] { "0", "2", "5", "7", "10", "11", null, "13", "15" };
            string[] arr2 = new string[] { "11", "13", "56", "8", null, "44", "55", "66", "77" };

          var v = arr1
                   .Zip(arr2, (x, y) => new { x, y })
                   .Where(a => !string.IsNullOrEmpty(a.x) && !string.IsNullOrEmpty(a.y))
                   .Select(a => new Test { d1 = double.Parse(a.x), d2 = double.Parse(a.y) })
                   .Where(a => (a.d1 % 5) == 0);
        }
    }