【问题标题】:Create new list of objects from two different lists从两个不同的列表创建新的对象列表
【发布时间】:2015-09-11 20:05:28
【问题描述】:

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

我需要获得一组新的相同复杂对象的列表,但将它们组合起来以计算较小对象的数量。我不知道该怎么做。我试图想办法将它们联合起来,做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 的匹配对,直到两个集合中较小的一个被用完,但对于较长列表的其余部分仍然包含单个复杂对象。

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

希望这有意义吗?尽可能以最好的方式问这个问题。

【问题讨论】:

  • 必须是List&lt;List&lt;Object1&gt;&gt;(内部列表正好包含2个元素)吗?可以改为List&lt;Tuple&lt;Object1, Object1&gt;&gt; 吗?
  • 不清楚你在问什么。您想要 5 个新列表吗?
  • 我需要它最终成为一组列表对象,但我不在乎它是从字典开始,还是先从其他东西开始。
  • 是的,结果是我需要 5 个新列表(最长列表的最大数量)。

标签: c# list


【解决方案1】:

您的问题有点不清楚,但我相信您想要的是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);

【讨论】:

  • 谢谢,我会尝试对此进行更多研究,看看是否有帮助。我无法添加外部库,但感谢您的考虑。我以最好的方式问了这个问题......我试图在反馈中给你一个 +,但由于我在这个问题上被否决了这么多,所以它不会适用。
  • @numlaar 如果您不能/不想依赖某个库的单一方法,请改用this implementation
  • @numlaar 没关系。不过,现在改进/改写您的问题还为时不晚 :)
  • 好的,谢谢,我会调查的。你至少明白我想要表达的意思。作为一个没有经验的开发人员来到这里非常令人沮丧,尽力提出一个问题,然后被抨击和否决。有点违背了目的。我不知道如何比我已经问得更好了。
【解决方案2】:

免责声明:我是在 @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

【讨论】:

  • 完美!这正是我所追求的。谢谢!!
【解决方案3】:

这个呢

            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;​

【讨论】:

  • 这只是返回更大的列表。这不是 OP 想要的。
  • 读取 cmets :是的,结果是我需要 5 个新列表(最长列表的最大计数)。
  • 没错,他需要一组 5 个列表。您的代码返回 1 个列表。阅读我和 Jamiec 的答案,了解 OP 正在寻找什么(当然,这个问题有点神秘)。
猜你喜欢
  • 2021-12-25
  • 2013-10-14
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多