[英]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
}
初始數組中具有相同索引的元素vehicleValue
, vehicleCodeAndDescription
和options
存儲在一個元組中,而元組存儲在數組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.