>我写了下面的方法:
// Merge two ArrayLists to the first one without duplication
public static void mergeIntoFirst(ArrayList array1, ArrayList array2)
{
if(array1==null | array2==null)
throw new ArgumentNullException();
if (array1 == array2)
return; //if they are pointing to the same array, then we can exit.
foreach (object obj in array2)
{
if (!array1.Contains(obj))
array1.Add(obj);
}
}
但是现在我想更改我的程序以使用linkedList,因为据我所知,数组列表不能很好地与linq
配合使用......
但是我需要输入是通用的,并且适用于所有链表类型,就像这里的 ArrayList 可以包含所有类型的对象一样。(我在代码中使用此方法两次,一次用于用户数组,另一次用于用户发送的消息数组(
我认为使用LinkedList<object>
可以解决它,因为任何东西都是对象(exept int,聊天双itc(
但是它在运行时会抛出一个铸造选项...那我该怎么办?谢谢!
下面是代码的实现,它应该适用于LinkedList<T>
和List<T>
实现的任何ICollection<T>
。 请注意,您必须在方法上定义泛型类型。
public static void MergeIntoFirst<T>(ICollection<T> c1, ICollection<T> c2)
{
if(c1==null || c2==null)
throw new ArgumentNullException();
if (c1 == c2)
return; //if they are pointing to the same array, then we can exit.
foreach (T item in c2)
{
if (!c1.Contains(item))
c1.Add(item);
}
}
然后你可以像这样使用它。
List<int> l1 = new List<int> { 1, 2, 3 };
List<int> l2 = new List<int> { 2, 3, 4 };
MergeIntoFirst(l1, l2);
Console.WriteLine(string.Join(",", l1));
// outputs: 1, 2, 3, 4
请注意,这与Enumerable.Union
的功能很接近,只是它会删除两个集合中存在的重复项并生成一个新集合,而不是改变第一个集合。