从两个不同的列表创建新的对象列表

时间:2015-09-11 11:37:38

标签: c# list

我有两个相同复杂对象的列表,但每个列表都有不同的对象数据。

我需要获得一组新的相同复杂对象的列表,但是将它们组合起来用于较小对象的计数。我不知道该怎么做。我试图找到一种方法来联合它们,做addrange,并尝试使用字典,但这比我以前做过的任何事情都复杂一点。我找到了类似的答案,但没有找到我的特定情况。

以下是我可以抽样代码的最佳方式:

List<Object1> ListA;
List<Object1> ListB;

ListA.count() = 5
ListB.count() = 3

new List<Object1> Object1CombinedList;

1. List<Object1> Object1CombinedList (Object1 (from listA), Object1 (from ListB))
2. List<Object1> Object1CombinedList (Object1 (from listA), Object1 (from ListB))
3. List<Object1> Object1CombinedList (Object1 (from listA), Object1 (from ListB))
4. List<Object1> Object1CombinedList (Object1 (from listA), null))
5. List<Object1> Object1CombinedList (Object1 (from listA), null))

我正想着以某种方式循环遍历两个独立的列表,以便在每个对中组合它们。 (我以为我可以用词典做到这一点,但无法使它工作)。最终结果是,我需要一组新的列表(同样是所有相同的复杂对象),等于两个列表中最长的列表的长度计数。

新集需要包含列表A和列表B中的匹配对,直到两个集中较小的一个用尽,但仍然包含一个复杂对象用于较长列表的其余部分。

上面显示的五个列表是我需要从两个原始源列表中获取的示例。 (以及他们的数据样本)。

希望有道理吗?我能以最好的方式问这个问题。

3 个答案:

答案 0 :(得分:2)

你的问题有点不清楚,但我相信你想要的是ZipAll方法。伪代码:

var listA = {1, 2, 3, 4}
var listB = {a, b, c}

ZipAll(listA, listB) == {(1, a), (2, b), (3, c), (4, null)}

幸运的是,您可以使用名为Sequences的库(披露:我是作者)。

ISequence<Tuple<Object1, Object1>> zipped = listA.AsSequence().ZipAll(listB, null, null);

答案 1 :(得分:1)

免责声明:我正在写这篇文章,因为@dcastro在评论。我使用了ZipAll方法的类似想法,但是从here 找到了

你所追求的是将两个列表压缩在一起,形成一个新的列表。不幸的是,当其中一个列表完成时,内置的Zip方法会停止,因此可以找到一个不需要的实现 - 通常称为ZipAll - here

然后这变得相当简单:

var listA = new List<string>(){"a1","a2","a3","a4","a5"};
var listB = new List<string>(){"b1","b2","b3"};

var combined = listA.ZipAll(listB, (a,b) => new List<string>(){a,b}).ToList();
for(var i=0;i<combined.Count;i++)
{
    Console.WriteLine("{0}: {1} | {2}",i,combined[i][0],combined[i][1]);
}

输出

0: a1 | b1
1: a2 | b2
2: a3 | b3
3: a4 | 
4: a5 | 

实例:http://rextester.com/PULLI83949

答案 2 :(得分:-2)

这个怎么样?

            List<int> A = new List<int>() { 1, 2, 3 };
            List<int> B = new List<int>() { 1, 2, 3, 4 };

            List<int> C = A.Count > B.Count ? A : B;​