2

假设有以下设置(假设数据的长度和一般情况相同)。

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] };
4

3 回答 3

10

根本没有循环怎么样?

a.Zip(b, (aa, bb) => new SuperString{A = aa, B = bb})

Zip方法的好处是,如果它们的长度不同,它将停在两个序列中较短的序列的末尾。

注意:如果您使用的是 .net < 4,则需要采用 @Cuong 的方法。

如果您的类型是任意的,则应该完全相同:

IEnumerable<Cool> a = GetCool();
IEnumerable<Lame> b = GetLame();
a.Zip(b, (aa, bb) => new Opposites{A = aa, B = bb});

需要注意的是,属性A必须Opposites是类型CoolB类型Lame(或父类型)

于 2012-09-13T14:58:59.263 回答
5

此外Zip,您可以使用Enumerable.Range

Enumerable.Range(0, a.Count)
          .Select(i => new SuperString{ A = a[i], B = b[i] });
于 2012-09-13T15:00:20.820 回答
3

使用Zip 方法:)

var result = Enumerable.Zip(
    GetStrings(0), 
    GetStrings(1), 
    (x,y) => new SuperString{ x,y}
);

另外,不要错过文档的这一部分:

如果序列没有相同数量的元素,则该方法会合并序列,直到它到达其中一个的末尾。例如,如果一个序列有三个元素,而另一个序列有四个,则结果序列将只有三个元素。

于 2012-09-13T14:59:37.230 回答