将两个`List`对象连接成一个抽象数据类型

时间:2012-09-13 14:56:51

标签: c#

假设有以下设置(假设数据的长度相同且一般很好)。

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

3 个答案:

答案 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}
);

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

  

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