在C#中无法将一个列表附加到另一个列表...尝试使用AddRange函数

8

你好,我正在尝试将一个列表添加到另一个列表中。之前我使用过 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 中有 4 个计数,resultCollection2 中有 6 个计数,添加范围后,resultCollection 的计数仍然为 4,而它应该有 10 个计数。

有谁能看出我做错了什么吗?任何帮助都将不胜感激。

谢谢,
Matt

5个回答

31
当你调用ToList()时,你并没有将集合封装在一个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()

4
我认为 .ToList() 方法会创建一个新的集合。因此,您的项目将被添加到一个新集合中,该集合会立即被丢弃,而原始集合则保持不变。

如果我尝试将其返回到一个新列表中,它会说:“无法隐式转换类型'void'为'System.Collection.Generic.List<E>'”,所以我的猜测是它没有返回任何东西? - Matt
我犯了同样的错误!AddRange返回void。 - Philip Wallace
1
使用Greg Beech提供的解决方案。另外,如果接受的话,选择他而不是我,我只是指出了问题,他不仅做到了这一点,还提供了解决方案! :) - Quibblesome

1

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

尝试一下:

List<E> list = resultCollection.ToList();
list.AddRange(resultCollection2);

1

尝试

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

List<E> newList = resultCollection.ToList();
newList.AddRange(resultCollection2);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接