Как создать единый список пар объектов из двух списков в С#?
У меня есть два списка объектов. Список A и список B. Мне нужно создать список C, который объединяет List A и List B в пары. Например:
List A
object a1
object a2
object a3
List B
object b1
object b2
object b3
List C (creates pairs)
object c1 (object a1, object b1)
object c2 (object a2, object b2)
object c3 (object a3, object b3)
Ответы
Ответ 1
Это сделало бы это:
public static IEnumerable<Tuple<T, U>> CombineWith<T, U>(this IEnumerable<T> first, IEnumerable<U> second)
{
using (var firstEnumerator = first.GetEnumerator())
using (var secondEnumerator = second.GetEnumerator())
{
bool hasFirst = true;
bool hasSecond = true;
while (
// Only call MoveNext if it didn't fail last time.
(hasFirst && (hasFirst = firstEnumerator.MoveNext()))
| // WARNING: Do NOT change to ||.
(hasSecond && (hasSecond = secondEnumerator.MoveNext()))
)
{
yield return Tuple.Create(
hasFirst ? firstEnumerator.Current : default(T),
hasSecond ? secondEnumerator.Current : default(U)
);
}
}
}
Изменить: я очень предпочитаю ответ Павла.
Ответ 2
Вы можете использовать метод Enumerable.Zip() в System.Linq.
IEnumerable<Tuple<A, B>> pairs = listA.Zip(listB, (a, b) => Tuple.Create(a, b));
Пример использования этого результирующего перечисляемого:
foreach (Tuple<A, B> pair in pairs)
{
A a = pair.Item1;
B b = pair.Item2;
}
Позор там не перегрузка, которая автоматизирует кортеж в .NET. Такое расширение будет выглядеть так:
public static IEnumerable<Tuple<TFirst, TSecond>> Zip<TFirst, TSecond>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second)
{
return first.Zip(second, Tuple.Create);
}
Это означало бы, что вы могли бы написать код, который выглядит так:
IEnumerable<Tuple<A, B>> pairs = listA.Zip(listB);
Примечание. Другим вариантом будет создание анонимных типов вместо Tuple
, но недостатком этого подхода является то, что вы не сможете (полезно) передать результирующий IEnumerable из метода, созданного им из-за тип, не имеющий имени.
Ответ 3
Что-то вроде этого:
var listA = new object[] { "1", "2", "3" };
var listB = new object[] { "a", "b", "c" };
var listC = Enumerable.Zip(listA,listB, (x,y)=>new {x,y});
foreach (var item in listC)
{
Console.WriteLine("{0},{1}", item.x,item.y);
}
Вывод: 1, а 2, б 3, с
Ответ 4
Когда вы говорите "пары", вы имеете в виду пары "ключ/значение"?
Если это так, вы хотите использовать Dictionary<object, object>
Ответ 5
Я бы предложил использовать список tupples
http://msdn.microsoft.com/en-us/library/system.tuple.aspx.