C# 用C压缩两个列表
我有两个整数值列表:C# 用C压缩两个列表,c#,list,linq,C#,List,Linq,我有两个整数值列表: List<int> list1 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; List<int> list2 = new List<int>() { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; 期望输出 { 12,24,16,56,20,96,24,144,28,200 } Zip方法没有支持索引的重载,您可以使用MoreL
List<int> list1 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List<int> list2 = new List<int>() { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
期望输出
{ 12,24,16,56,20,96,24,144,28,200 }
Zip方法没有支持索引的重载,您可以使用MoreLinq库或方法代替支持索引的元素选择器
var result=list1。选择
值,索引=>
索引%2==0?value+list2[索引]:value*list2[索引]
托利斯特先生;
result.ForEachConsole.WriteLine;
如果两个列表的长度相同,并且给您一个预期的输出12、24、16、56、20、96、24、144、28、200,那么它将起作用
另一种选择是将两个列表压缩到匿名对象列表中,然后计算它们的总和
var result=list1
.Ziplist2,a,b=>新的{a,b}
.Selectvalue,索引=>索引%2==0?value.a+value.b:value.a*value.b
托利斯特先生;
使用。选择而不是压缩
您可以先压缩,然后使用包含索引的Select重载
var result = list1.Zip(list2, (a,b) => (A:a, B:b))
.Select((x, i) => i % 2 == 0 ? x.A + x.B : x.A * x.B);
注意,我在这里使用的是值元组,因此根据您的C版本,您可能需要使用匿名类,而不是a,b=>new{a=a,b=b}另一个选项:
int index = 0;
var zipped = list1.Zip(list2, (a, b) => index++ % 2 == 0 ? a + b : a * b);
简明扼要地说,但是它使用了一个副作用,这当然是不好的。正在运行的代码的当前输出是什么tried@EhsanSajjad那甚至不能编译。@juharr是的,我的错:D@EhsanSajjad按产量计算,,我的意思是所需的输出这比其他答案要好,因为它不能从LINQ表达式中访问list2。为什么不使用Zip的参数resultSelector来执行=>i%2?x、 A+x.B:x.A*x.B零件。这样,您就不必添加Select@HaraldCoppoolse因为Zip没有包含index.Oops的重载,这是我的错。
var result = list1.Zip(list2, (a,b) => (A:a, B:b))
.Select((x, i) => i % 2 == 0 ? x.A + x.B : x.A * x.B);
int index = 0;
var zipped = list1.Zip(list2, (a, b) => index++ % 2 == 0 ? a + b : a * b);