首页 > 解决方案 > 如何访问自定义类型通用列表中的变量?

问题描述

我有一个HashSet<T>,一个List<T>和一个类。

Relayhash包含一组Vector3变量。用作输入列表,通常随机或通过另一个规则选择一个变量。

tempList临时存储vector3变量以进行比较。

BuiltList包含一组自定义类类型作为选定变量的目的地。在这里,我想看看它是否包含某个变量(posv3)。

HashSet<Vector3> relayhash = new HashSet<Vector3>();
List<Vector3> tempList = new List<Vector3>();
public List<moduleClass> BuildList = new List<moduleClass>(); 


  public class moduleClass
{
    public int step { get; set; }
    public int modID { get; set; }
    public string modType { get; set; }
    public int typeint { get; set; }
    public Vector3 posv3 { get; set; }
}

我想知道是否relayhash包含一个已经在BuildList. 如果为真,则需要从“relayHash”中删除找到的 Vector3(s)。

这些是我尝试过的一些脚本:

 Vector3 tempvar =  moduleClass.posv3; // ClassName.VariableName does not work, why?

或者,

foreach (Vector3 tempv3 in relayhash)// 
{
moduleClass tempvar = new moduleClass();
if (BuildList.Contains(tempvar.tempv3))// not accepted, 'does not contain a definition..)
{// do something}
}

或者,

foreach (Vector3 tempv3 in relayhash)// 
        {
            moduleClass tempvar = new moduleClass();
            Vector3 tempv = tempvar.posv3;
            tempv = tempv3;

            if (BuildList.Contains(tempv)):// but, cannot convert from 'UnityEngine.Vector3' to 'mods.moduleClass'
            {
                //   var tempvar = new moduleClass(posv3);
                //  tempList.Add(tempv3);
            }
        }

上面的例子有很多变化,但我看不到树木的森林。尽管已经查找并尝试了许多类似的示例变体,但我的语法并不正确。

所以我的问题是:如何访问自定义类型列表中的变量(并与另一个列表中的相同类型进行比较)?

感谢您的关注。

ps:

现在的主要问题是无法从“relayhash”中删除找到的向量。例如:

var foundVectors = relayhash.Intersect(BuildList.Select(x => x.posv3));

relayhash.Remove(foundVectors);

结果是:

error CS1503: Argument 1: cannot convert from 'System.Collections.Generic.IEnumerable<UnityEngine.Vector3>' to 'UnityEngine.Vector3'

标签: c#unity3d

解决方案


我想知道“relayhash”是否包含一个已经在“BuildList”中的向量。

更具体地说,您想查看是否relayhash包含Vector3 等于posv3中任何项目BuildList的值的 a 。这是否有助于了解查询的结构?

您可以Any在任一列表中使用我们,但由于relayhash已经是 a HashSet,它会进行廉价Contains检查,因此更高效的方法可能是Any在自定义对象列表中使用:

bool found = BuildList.Any(x => relayhash.Contains(x.posv3));

如果要捕获实际对象,则 aWhere可能更合适:

var foundItems = BuildList.Where(x => relayhash.Contains(x.posv3));

然后,您可以从过滤器列表中捕获 v3 项目:

var foundVectors = foundItems.Select(x => x.posv3);

或做一个Intersect

var foundVectors = relayhash.Intersect(BuildList.Select(x => x.posv3));

推荐阅读