Как объединить 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() не мой друг в этом случае, верно?
ТИА,
Ответы
Ответ 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
выражения запросов упрощают работу. Попробуйте оба и посмотрите, что вы найдете более читаемыми:)