8

嗨,我正在尝试将 1 个列表附加到另一个列表。我以前使用AddRange()过它,但它似乎在这里不起作用......这是代码:

IList<E> resultCollection = ((IRepository<E, C>)this).SelectAll(columnName, maxId - startId + 1, startId);                
IList<E> resultCollection2 = ((IRepository<E, C>)this).SelectAll(columnName, endId - minId + 1, minId);
resultCollection.ToList().AddRange(resultCollection2);

我进行了调试以检查结果,这就是我得到的结果:resultCollection计数为 4resultCollection2计数为 6,添加范围后,resultCollection计数仍然只有 4,而应该计数为 10。

谁能看到我做错了什么?任何帮助表示赞赏。

谢谢,
马特

4

5 回答 5

31

当您打电话时,ToList()您并没有将集合包装在 a 中,List<T>而是在创建一个List<T>包含相同项目的新集合。因此,您在这里有效地做的是创建一个新列表,将项目添加到其中,然后将列表丢弃。

您需要执行以下操作:

List<E> merged = new List<E>();
merged.AddRange(resultCollection);
merged.AddRange(resultCollection2);

或者,如果您使用的是 C# 3.0,只需使用Concat,例如

resultCollection.Concat(resultCollection2); // and optionally .ToList()
于 2009-11-12T19:13:03.350 回答
4

我会假设 .ToList() 正在创建一个新集合。因此,您的物品将被添加到一个新的收藏中,该收藏会立即被丢弃,而原始收藏则保持不变。

于 2009-11-12T19:11:19.157 回答
1

resultCollection.ToList()将返回一个新列表。

尝试:

List<E> list = resultCollection.ToList();
list.AddRange(resultCollection2);
于 2009-11-12T19:11:28.580 回答
1

尝试

IList newList = resultCollection.ToList().AddRange(resultCollection2);

List<E> newList = resultCollection.ToList();
newList.AddRange(resultCollection2);
于 2009-11-12T19:11:34.447 回答
0

您可以使用以下任何一种:

List<E> list = resultCollection as List<E>;
if (list == null)
    list = new List<E>(resultCollection);
list.AddRange(resultCollection2);

或者:

// Edit: this one could be done with LINQ, but there's no reason to limit
//       yourself to .NET 3.5 when this is just as short.
List<E> list = new List<E>(resultCollection);
list.AddRange(resultCollection2);

或者:

List<E> list = new List<E>(resultCollection.Concat(resultCollection2));
于 2009-11-12T19:16:56.913 回答