簡體   English   中英

如何在 C# Zip 中組合三個數組?

[英]How to combine three arrays in C# Zip?

我希望看到vehicleDetail的值有三個項目,每個項目代表每個數組與此代碼,我是否遺漏了一些語法?

var vehicleValue = // array 1
var vehicleCodeAndDescription = // array 2
var options = //array 3

    foreach (var vehicleDetail in (vehicleCodeAndDescription.Zip(vehicleValue, Tuple.Create))
                 .Zip(options, Tuple.Create))
    {
       //do something
    }

您選擇的是

Tuple<Tuple<T1, T2>, T3>

因此,您最終將獲得如下所示的訪問權限:

myTuple.Item1.Item2

這有點沒用。

Enumerable類上沒有 3way Zip ,但是沒有什么可以阻止您編寫一個:

public static class Zips
{
    public static IEnumerable<TResult> Zip3<T1, T2, T3, TResult>(
        this IEnumerable<T1> seq1,
        IEnumerable<T2> seq2,
        IEnumerable<T3> seq3,
        Func<T1, T2, T3, TResult> selector) => seq1
            .Zip(seq2, (x, y) => (x, y))
            .Zip(seq3, (x, y) => (x.x, x.y, y))
            .Select(x => selector(x.x, x.Item2, x.Item3));
}

所以,現在你可以:

arr1.Zip3(arr2, arr3, Tuple.Create)

你會得到你預期的Tuple<T1, T2, T3>類型的 3 值元組

請考慮,對於您需要的每個 Zip 數量,您都需要創建一個新方法。 顯然,這種方法的復雜性也增加了。

試試這個:

var vehicleDetails = vehicleValue
            .Zip(vehicleCodeAndDescription, (value, codeAndDescription) => new { Value = value, CodeAndDescription = codeAndDescription })
            .Zip(options, (vcd, option) => new { Value = vcd.Value, CodeAndDescription = vcd.CodeAndDescription, Option = option});

或使用元組:

var vehicleDetails = vehicleValue
            .Zip(vehicleCodeAndDescription, (value, codeAndDescription) => Tuple.Create(value, codeAndDescription))
            .Zip(options, (vcd, option) => Tuple.Create(vcd.Item1, vcd.Item2, option));

您可以使用Enumerable.Range組合三個數組:

var vehicleValue = // array 1
var vehicleCodeAndDescription = // array 2
var options = //array 3

var arr = Enumerable.Range(0, new int[]{vehicleValue.Length,vehicleCodeAndDescription.Length,options.Length}.Min())
                    .Select(i => Tuple.Create(vehicleValue[i], vehicleCodeAndDescription[i], options[i]))
                    .ToArray();

foreach (var vehicleDetail in arr)
{
    //do something
}

初始數組中具有相同索引的元素vehicleValuevehicleCodeAndDescriptionoptions存儲在一個元組中,而元組存儲在數組arr

代碼,就像現在一樣,用一個 2 元組作為它的第一項來制作一個 2 元組。 要生成 3 元組,應改用以下表達式:

foreach (var vehicleDetail in vehicleCodeAndDescription
    .Zip(vehicleValue, Tuple.Create))
    .Zip(options, (vv, o) => Tuple.Create(vv.Item1, vv.Item2, o)))
{
    // do something
}

或者,如果您想更加一致:

foreach (var vehicleDetail in vehicleCodeAndDescription
    .Zip(vehicleValue, (vc, vv) => Tuple.Create(vc, vv)))
    .Zip(options, (vcvv, o) => Tuple.Create(vcvv.Item1, vcvv.Item2, o)))
{
    // do something
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM