Подтвердить что ты не робот

Как объединить 2 списка с помощью LINQ?

Env.:.NET4 С#

Привет всем,

Я хочу объединить эти 2 списка: { "A", "B", "C", "D" } и { "1", "2", "3" }

в этот:

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

Очевидно, я мог бы использовать вложенные циклы. Но мне интересно, поможет ли LINQ. Насколько я понимаю, Zip() не мой друг в этом случае, верно?

ТИА,

4b9b3361

Ответ 1

По сути, вы хотите сгенерировать декартово произведение и затем объединить элементы каждого 2-кортежа. Это проще всего сделать в синтаксисе запроса:

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

Ответ 2

Используйте SelectMany, когда вы хотите сформировать декартово произведение двух списков:

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

Ответ 3

SelectMany, безусловно, правильный подход, будь то использование нескольких предложений "от" или с помощью прямого вызова, но здесь альтернатива использованию Hightechrider:

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

Мне лично это легче понять, поскольку оно ближе к версии "multiple from": для каждого "a" в "aList" мы создаем новую последовательность - в этом случае она всегда "bList". Для каждой пары (a, b), созданной декартовым объединением, мы проецируем результат, который является просто конкатенацией двух.

Просто чтобы быть ясным: оба подхода будут работать. Я просто предпочитаю этот:)

Что касается того, насколько яснее синтаксиса выражения запроса... Я не уверен. Обычно я использую вызовы методов, когда это просто случай использования одного оператора, но для Join, GroupJoin, SelectMany и GroupBy выражения запросов упрощают работу. Попробуйте оба и посмотрите, что вы найдете более читаемыми:)