gpt4 book ai didi

c# - 如何压缩两个不同大小的列表以创建一个与原始列表中最长的列表相同的新列表?

转载 作者:行者123 更新时间:2023-12-02 02:31:55 24 4
gpt4 key购买 nike

我有两个不同大小的 C# 列表,例如

List<int> list1 = new List<int>{1,2,3,4,5,6,7};
List<int> list2 = new List<int>{4,5,6,7,8,9};

我想使用 linq Zip 方法将这两个组合成一个大小为 list1 的元组列表。这是我正在寻找的结果列表

{(1,4), (2,5), (3,6), (4,7), (5,8), (6,9), (7,0)}  //this is of type List<(int,int)

由于 list1 的最后一项在 list2 中没有对应项,我用默认值填充结果列表的最后一项(在本例中为 0,因为在我的情况下它永远不会出现在任何原始列表中).

有没有一种方法可以单独使用 linq Zip 方法来实现这一点?

最佳答案

您可以使用Concat 使它们大小相同,然后压缩:

var zipped = list1.Concat(Enumerable.Repeat(0,Math.Max(list2.Count-list1.Count,0)))
.Zip(list2.Concat(Enumerable.Repeat(0,Math.Max(list1.Count-list2.Count,0))),
(a,b)=>(a,b));

或者创建一个扩展方法:

public static class ZipExtension{
public static IEnumerable<TResult> Zip<TFirst,TSecond,TResult>(
this IEnumerable<TFirst> first,
IEnumerable<TSecond> second,
Func<TFirst,TSecond,TResult> func,
TFirst padder1,
TSecond padder2)
{
var firstExp = first.Concat(
Enumerable.Repeat(
padder1,
Math.Max(second.Count()-first.Count(),0)
)
);
var secExp = second.Concat(
Enumerable.Repeat(
padder2,
Math.Max(first.Count()-second.Count(),0)
)
);
return firstExp.Zip(secExp, (a,b) => func(a,b));
}
}

所以你可以这样使用:

//last 2 arguments are the padder values for list1 and list2
var zipped = list1.Zip(list2, (a,b) => (a,b), 0, 0);

关于c# - 如何压缩两个不同大小的列表以创建一个与原始列表中最长的列表相同的新列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64915897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com