假设有以下设置(假设数据的长度相同且一般很好)。
List<String>
a = GetStrings(0),
b = GetStrings(1);
for(int i = 0; i < a.Count; i++)
yield return new SuperString{ A = a[i], B = b[i] };
我想知道是否可以将其重构为foreach
循环,如果它看起来非常难看。我更喜欢在for
之前使用它,因为操作将在元素对的每个上执行。
编辑:
我可能会对细节感到匮乏。对于那个很抱歉。如果类型是任意的怎么办?即如下?
IEnumerable<Cool> a = GetCool();
IEnumerable<Lame> b = GetLame();
for(int i = 0; i < a.Count; i++)
yield return new Opposites{ A = a[i], B = b[i] };
答案 0 :(得分:10)
根本没有循环怎么样?
a.Zip(b, (aa, bb) => new SuperString{A = aa, B = bb})
Zip
方法的好处是,如果它们的长度不同,它将在两个序列中较短的序列结束时停止。
注意:如果您使用的是.net&lt; 4,你会想要采用@ Cuong的方法。
如果您的类型是任意的,则应该完全相同:
IEnumerable<Cool> a = GetCool();
IEnumerable<Lame> b = GetLame();
a.Zip(b, (aa, bb) => new Opposites{A = aa, B = bb});
请注意,A
的属性Opposites
必须属于Cool
类型且B
类型Lame
(或父类型)
答案 1 :(得分:5)
在Zip
旁边,您可以使用Enumerable.Range
:
Enumerable.Range(0, a.Count)
.Select(i => new SuperString{ A = a[i], B = b[i] });
答案 2 :(得分:3)
使用Zip method:)
var result = Enumerable.Zip(
GetStrings(0),
GetStrings(1),
(x,y) => new SuperString{ x,y}
);
另外,请不要错过文档的这一部分:
如果序列没有相同数量的元素,则该方法会合并序列,直到它们到达其中一个序列的末尾。例如,如果一个序列有三个元素而另一个序列有四个,则结果序列只有三个元素。