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、2 つのシーケンスの長さが異なる場合に短い方のシーケンスの終わりで停止することです。

注: .net < 4 を使用している場合は、@Cuong の方法を使用することをお勧めします。

タイプが任意の場合、まったく同じことが機能するはずです。

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

のプロパティは型と型(または親型)AOppositesなければならないという警告がありますCoolBLame

于 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}
);

また、ドキュメントの次の部分もお見逃しなく:

シーケンスに同じ数の要素がない場合、メソッドはシーケンスのいずれかの終わりに到達するまでシーケンスをマージします。たとえば、1 つのシーケンスに 3 つの要素があり、もう 1 つのシーケンスに 4 つの要素がある場合、結果のシーケンスには 3 つの要素しかありません。

于 2012-09-13T14:59:37.230 に答える