c# - 如何访问自定义类型通用列表中的变量?
问题描述
我有一个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'
解决方案
我想知道“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));
推荐阅读
- excel - 遍历列、打开工作表和复制/粘贴
- sql - 如何在“case when”变化的单行上聚合结果
- c++ - 在 C++ 中表示 asn 结构
- reactjs - 为什么我们可以使用鼠标滚轮更新数字输入的值?
- python-3.x - django - 如何检查电子邮件是否已经存在
- json - 基于列pyspark的条件列选择
- html - 如何从角度组件显示包含内联样式标签的字符串 HTML
- r - R:将最大的 5 行保留在一个表中
- flask - Flask-Restx:从 Swagger 设置默认路由?
- asp.net - 西班牙语字符在服务器 ASP.NET 生产服务器上无法正确显示,但在我的开发盒上正常