2011-11-18 50 views
1

我有这样的代码:如何连接列表<type>?

protected IList<MyObject> offerte; 

offerte = offerte.Union(from MyObject object in MyObjects 
         select object).ToList(); 

,但我得到一个System.ArgumentNullException(也许是因为我加入一个IEnumerable的<>在列表<>)。

那么,我该如何连接列表<>?

+0

你只是忘记初始化你的对象,你的代码没有错。 –

+0

-1?为什么是-1?我无法理解那些赞成... – markzzz

+1

你的代码有一个基本问题(或者在这里是不完整的):你的对象在声明后缺少初始化,这就是你的异常的原因。下面的答案针对你的第二个问题:LINQ中Union和Concat的区别,这更有趣! :)只是适当地编辑你的帖子,它不会被低估(希望) –

回答

7

联合不是拼接,请检查:http://msdn.microsoft.com/en-us/library/bb341731.aspx。例如,具有相同值的2组的联合会产生相同的精确集合。

你需要的是Concat(惊奇,惊奇):

offerte = offerte.Concat(from MyObject object in MyObjects 
        select object).ToList(); 

然而,ArgumentNullException仍然会发生,导致offerte未初始化(检查devdigital的回答)。

+0

其实很奇怪。随着我的代码(我认为是错误的)我与IEnumerable结合列表。然后,与合并的结果(半列表,一半Ienumerable)我转换整个列表?它很奇怪imo ... – markzzz

+0

这并不奇怪。 List也实现IEnumerable ,而Concat是IEnumerable的扩展方法。 – Bartosz

+0

呃,也许我不知道List/IList/IEnumerable是如何协同工作的。任何好的教程? – markzzz

4

你会得到例外,因为offerte为空。请尝试:

offerte = new List<MyObject>(MyObjects); 
1

试试这个...

protected IList<MyObject> offerte = new List<MyObject>(MyObjects); 

// do your stuff 
2

联盟和连锁之间的主要区别是当你认为你的数据是集合或序列。

在联盟的情况下,你将合并两组数据,这意味着如果你有两个列表中一个值比将保持只有一次,因此合并{1, 2, 3}{2, 3, 4}给你{1, 2, 3, 4}(前提是您的自定义数据类型实现选择恰当的接口并重写散列函数以启用LINQ中的相等性比较)。

如果你想连接你的数据,那么第二部分将被追加到第一个标准杆,你将得到{1, 2, 3, 2, 3, 4}

你想要对你的数据做什么?

P.S.你不能得到半Enumerable和半列表,每个List是一个IEnumerable,因为List实现了这个接口。由于LINQ被懒惰地评估,你只会得到一个查询。在你的情况下,你可以通过调用.ToList()方法强制进行急切的评估。

+0

当我回答另一个答案时,我不知道List/IList/IEnumerable是如何协同工作的。任何好的教程? – markzzz

+0

LINQ基本上在两个接口IEnumerable和IQuereable上运行,而不是类型。所以,实现IEnumerable的所有东西也都支持LINQ。如果你想看看哪些数据类型实现IEnumerable。如果你想我可以为你编译这些列表。 –

+0

但它意味着在两个接口上运行?它基本上将数据作为List或IEnumerable存储在集合中。这就是我不明白的东西(比如IList只是List的接口!!?!?)。 – markzzz