C# + Unity - 从类列表中的变量中获取最小值[重复]

Posted

技术标签:

【中文标题】C# + Unity - 从类列表中的变量中获取最小值[重复]【英文标题】:C# + Unity - Getting the MIN value from a variables inside a List of Classes [duplicate] 【发布时间】:2021-02-06 00:33:44 【问题描述】:

我有这个类的列表:

public class EachEnemy

    public GameObject enemy;
    public Vector3 coords;
    public float distance;


他们会计算到船的“距离”。 随着敌人的生成和移动,距离变量一直在变化。

我需要在该类的列表中找到最小的距离,以及它的索引,以便我可以瞄准 Enemy 对象。

【问题讨论】:

morelinq.github.io/1.x/ref/api/html/… 【参考方案1】:

你可以用Linq OrderBy点赞

using System.Linq;

...

// Wherever you get this from
List<EachEnemy> allEnemies;

// Sorted by the distance to this object
var sortedEnemies = allEnemies.OrderBy(enemy => (transform.position - enemy.coords).sqrMagnitude);
// Or depending on how your class is used simply
//var sortedEnemies = allEnemies.OrderBy(enemy => enemy.distance);

// This would return null if the list was empty
// Or the first element of the sorted lost -> smallest distance  
var nearestEnemy = sortedEnemies.FirstOrDefault();

注意使用

OrderBy(enemy => (transform.position - enemy.coords).sqrMagnitude);

会比首先实际计算距离更有效,因为它会跳过对所有向量 sqrMagnitudes 使用平方根。因为a &gt; b 也暗示了a² &gt; b²,并且我们知道幅度总是正的,所以知道所有增量向量的sqrMagnitudes 就足以对它们进行排序。

这样做的好处是你还可以获得第二和第三近的敌人等。

【讨论】:

尽管如此,在 O(n) 可行的情况下实现 O(n log n) 是没有意义的。数据不需要排序; OP 只想要具有最小值的项目,可以在线性时间内找到。【参考方案2】:
float smallestDistance = eachEnemyList[0].distance;

    int index = 0;

    for(int i = 1; i < eachEnemyList.Count; i++)
    
        if(eachEnemyList[i].distance < smallestDistance)
        
            smallestDistance = eachEnemyList[i].distance;

            index = i;
        
    

这可能没有完美优化,但应该没问题。这为您提供了最小距离和包含最小距离的 EachEnemy 类的索引。

【讨论】:

【参考方案3】:

您可以遍历列表中的每个项目并在循环外保存值,也可以将索引保存在循环外,例如

EachEnemy someFuncname(List<EachEnemy> list) 

    int index = 0;
    EachEnemy ea = null;
    float distance = 9999 ///
    
    foreach (var Enemy in list) 
        if (Enemy.Distance < distance) 
            ea = Enemy;
    
    return ea;

同样的方法也可以返回索引。

【讨论】:

以上是关于C# + Unity - 从类列表中的变量中获取最小值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Unity:列表变量数组。如何在 C# 中正确声明它

在unity5中,用c#脚本如何获取UGUI中Input field中的文本?

如何从类变量数组中访问类成员?

在字典的列表中添加变量(Dictionary<Key,List<var>)unity C#

C# 从类库中获取资源图片,把图片资源保存到类库中

从类路径目录中获取资源列表