unity将泛型类型作为传参
把不同的泛型复合类型变量列表(list)传到同一个函数中。
该泛型容器类型是一个链表GFLink。
这些GFLink复合容器类型的声明符都是来自同一个基类BaseType的派生类。
现想要通过蓄水池算法来获取这些GFLink中所有派生类TypeA:BaseType、TypeB:BaseType的随机集合。
如现有这些声明符为AnimalBase的派生类
Dog:AnimalBase
Cat:AnimalBase
而实例是
GFLink<Dog> gfLinkA
GFLink<Cat> gfLinkB
我想从GFLink中提取随机的AnimalBase对象放到另一个List<AnimalBase>里面,并且想让声明符为Dog的gfLinkA和声明符为Cat的gfLinkB都可以调用这个方法
那么可以写成
public void ReservoirSampling<T>(List<AnimalBase> listTargets, GFLink<T> gfLink) { int n= 0; foreach(var target in gfLink) { var unit = target as AnimalBase; n++; if(listTargets.Capacity > listTargets.Count) { listTargets.Add(unit); } else { var random = Random.Range(0, n+1); if(random < targets.Capacity) { targets[n%targets.Capacity] = unit; } } } }
然后这样调用即可
1 List<AnimalBase> listTargets = new List<AnimalBase>(20) ; 2 GFLink<Dog> gfLinkA; 3 GFLink<Cat> gfLinkB; 4 5 ReservoirSampling(listTargets , gfLinkA); 6 ReservoirSampling(listTargets , gfLinkB);