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

 

posted @ 2022-09-06 18:10  anesu  阅读(29)  评论(0编辑  收藏  举报