Соедините 2 списка по порядку вместо условия в LINQ - PullRequest
5 голосов
/ 24 апреля 2009

Как можно объединить 2 списка одинаковой длины (чтобы создать третий список равной длины), где я не хочу указывать условие, а просто полагаюсь на порядок элементов в 2 списках.

Например, как я могу присоединиться:

{1,2,3,4} with {5,6,7,8}

производить:

{{1,5}, {2,6}, {3,7}, {4,8}}

Я пробовал следующее:

from i in new []{1,2,3,4}
from j in new []{5,6,7,8}
select new { i, j }

но это приводит к перекрестному соединению. Когда я использую join, мне всегда нужно указывать «on».

Ответы [ 3 ]

15 голосов
/ 24 апреля 2009

Вы можете использовать Выбрать в первом списке, использовать индекс элемента и получить доступ к элементу во втором списке:

var a = new [] {1,2,3,4};
var b = new [] {5,6,7,8};

var qry = a.Select((i, index) => new {i, j = b[index]}); 
5 голосов
/ 28 октября 2010

Если вы используете .Net 4.0, вы можете использовать метод расширения Zip и кортежи.

var a = new [] {1,2,3,4};
var b = new [] {5,6,7,8};

var result = a.Zip(b, (an, bn) => Tuple.Create(an, bn));

Кроме того, вы можете хранить их как массивы:

var resultArr = a.Zip(b, (an, bn) => new []{an, bn});
0 голосов
/ 28 октября 2010

Существует половинное решение, если вы хотите использовать синтаксис запроса. На полпути в том смысле, что вам нужно использовать метод Select в обоих списках, чтобы получить индексы, которые вы будете использовать в предложении where.

int[] list1 = {1,2,3,4};
int[] list2 = {5,6,7,8};

var result = from item1 in list1.Select((value, index) => new {value, index})
             from item2 in list2.Select((value, index) => new {value, index})
             where item1.index == item2.index
             select new {Value1 = item1.value, Value2 = item2.value};

Преимущество этого решения состоит в том, что оно не завершится ошибкой, если списки имеют разную длину, как в случае решения, использующего индексатор.

...