2011-01-26 13 views
29

のEnv:.NET4 C#LINQを使用して2つのリストを結合する方法は?

こんにちはすべて、

私はこれらの2つのリスト組み合わせたい:この一つに{ "A", "B", "C", "D" }{ "1", "2", "3" }

を:明らか

{ "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3", "D1", "D2", "D3" } 

、私は使用することができますネストされたループ。しかし、LINQが役立つかどうかは疑問です。 私が理解する限り、Zip()はこの場合は私の友人ではありません。

aList.SelectMany(a => bList.Select(b => a + b))

+2

通常LINQでこのような何かを始めるとき、お願いしbenificialの「どのように私はこれを行うだろう、これらは、データベース内のテーブルであれば」 – SWeko

答えて

37

は基本的に、あなたはデカルト積を生成し、各2の要素を連結する:

TIA、

+1

Jonが指摘しているように、*私はこの答えを(この記事の時点で)最もわかりやすく見つけています3.実際には、LINQなしで使​​うネストループにマッチします。この回答を選択しないと他の人が議論になることがあります。もちろん、私は3つの答えを受け入れることができるようにしたいと思っています: –

59

使用SelectManyは、次の2つのリストの直積を形成したいときタプル。これは、クエリ構文で行うのが最も簡単です:、

var cartesianConcat = from a in seq1 
         from b in seq2 
         select a + b; 
+1

これがとてもエレガントです!これが私がLINQを愛する理由です! – Chris

+0

+1、美しく簡潔... –

25

SelectManyは間違いなく正しいアプローチである句「から」またはダイレクトコールで複数を使用しているかどうかが、ここでのHightechriderの使用に代わるものです:

var result = aList.SelectMany(a => bList, (a, b) => a + b); 

"multiple from"バージョンに近いので、わかりやすくわかります。 "aList"の各 "aList"に対して、新しいシーケンスを生成します。この場合、常に "bList"です。デカルト結合によって生成された各(a、b)対について、我々は2つの連結のみの結果に投影する。

ちょうど明白である:どちらのアプローチも有効です。私はちょうどこれを好む:)

これは、クエリ式の構文よりも明確かどうか...私はわからない。それだけで、単一の演算子を使用した場合だとき、私は通常利用方法は呼び出しますが、JoinGroupJoinSelectManyGroupByため、クエリ式は、物事を単純化しません。両方を試してみて、あなたがより読みやすい見つけるた参照:)

+9

ちょっとジョン、いつも尋ねたかったのですが、あなたはどれくらいの頻度であなたですか? :) –

+4

@The_Butcher:ああ、私はたびたびポップアップします... –

+2

@The_Butcher:http://meta.stackexchange.com/questions/555/why-does-jon-skeet-never-sleep/566#566 –

関連する問題