C#使用对象字段在列表中查找对象
因此,我有以下C#使用对象字段在列表中查找对象,c#,list,linq,C#,List,Linq,因此,我有以下列表: List<AttackStyle> AttackStyles = new List<AttackStyle>(); 现在,我希望找到参数id字段,其中ActionStyleAlias等于一个值(例如“Jump”) 这适用于Unity应用程序,因此搜索/查找需要尽可能快 直溶液为: var result = AttackStyles.FirstOrDefault(x => x.ActionStyleAlias == "Jump").Parame
列表
:
List<AttackStyle> AttackStyles = new List<AttackStyle>();
现在,我希望找到参数id
字段,其中ActionStyleAlias
等于一个值(例如“Jump”
)
这适用于Unity应用程序,因此搜索/查找需要尽可能快 直溶液为:
var result = AttackStyles.FirstOrDefault(x => x.ActionStyleAlias == "Jump").ParameterID;
var pId = AttackStyles.FirstOrDefault(x=> x.ActionStyleAlias == "Jump")?.ParameterID
但是,如果您想获得更好的性能,最好是索引您想要的最有用的属性。因此,在最有用的字段上构造一个字典,以便及时获得更好的性能。例如:
var styles = new Dictionary<string, AttackStyle>();
styles.Add("Jump", new AttackStyle()
{
Name = "Attack Achilles",
ParameterID = 0,
Forward = Vector3.forward,
HorizontalFOA = 70f,
VerticalFOA = 40f,
DamageModifier = 1f,
ActionStyleAlias = "Jump",
IsInterruptible = true
});
或者如果它可能为空:
if(styles.Keys.Contains("Jump"))
var pId = styles["Jump"].ParamterId;
直接的解决方案是:
var pId = AttackStyles.FirstOrDefault(x=> x.ActionStyleAlias == "Jump")?.ParameterID
但是,如果您想获得更好的性能,最好是索引您想要的最有用的属性。因此,在最有用的字段上构造一个字典,以便及时获得更好的性能。例如:
var styles = new Dictionary<string, AttackStyle>();
styles.Add("Jump", new AttackStyle()
{
Name = "Attack Achilles",
ParameterID = 0,
Forward = Vector3.forward,
HorizontalFOA = 70f,
VerticalFOA = 40f,
DamageModifier = 1f,
ActionStyleAlias = "Jump",
IsInterruptible = true
});
或者如果它可能为空:
if(styles.Keys.Contains("Jump"))
var pId = styles["Jump"].ParamterId;
您可以尝试扩展方法。你也应该考虑零的情况:
static class Extensions
{
public static int? FindParameterId(this List<AttackStyle> values, string actionStyleAlias)
{
return values.FirstOrDefault(x => x.ActionStyleAlias == actionStyleAlias)?.ParameterID;
}
}
静态类扩展
{
公共静态int?FindParameterId(此列表值,字符串actionStyleAlias)
{
返回值.FirstOrDefault(x=>x.ActionStyleAlias==ActionStyleAlias)?.ParameterID;
}
}
然后使用它:
List<AttackStyle> attackStyles = new List<AttackStyle>();
var parameterId = attackStyles.FindParameterId("Jump");
List attackStyles=new List();
var parameterId=attackStyles.FindParameterId(“跳转”);
您可以尝试扩展方法。你也应该考虑零的情况:
static class Extensions
{
public static int? FindParameterId(this List<AttackStyle> values, string actionStyleAlias)
{
return values.FirstOrDefault(x => x.ActionStyleAlias == actionStyleAlias)?.ParameterID;
}
}
静态类扩展
{
公共静态int?FindParameterId(此列表值,字符串actionStyleAlias)
{
返回值.FirstOrDefault(x=>x.ActionStyleAlias==ActionStyleAlias)?.ParameterID;
}
}
然后使用它:
List<AttackStyle> attackStyles = new List<AttackStyle>();
var parameterId = attackStyles.FindParameterId("Jump");
List attackStyles=new List();
var parameterId=attackStyles.FindParameterId(“跳转”);
如果集合中有必需的项,我们首先返回参数ID
<代码>-1否则:
var result = AttackStyles
.Where(item => item.ActionStyleAlias == "Jump")
.Select(item => item.ParameterID)
.DefaultIfEmpty(-1)
.First();
如果集合中有必需的项,那么让我们首先返回
ParameterID
<代码>-1否则:
var result = AttackStyles
.Where(item => item.ActionStyleAlias == "Jump")
.Select(item => item.ParameterID)
.DefaultIfEmpty(-1)
.First();
你的意思是
x=>x.ActionStyleAlias==“Jump”
@HosseinNarimaniRad是的,输入时考虑了javascript:p如果没有找到AttackStyle
的ActionStyleAlias==“Jump”
条件下的x.ActionStyleAlias==“Jump”
@HosseinNarimaniRad是,输入时考虑了javascript:p如果未找到带有ActionStyleAlias==“Jump”
条件的AttackStyle
,则会引发异常。您能给我一个这样的示例吗?@marcrasmusen键上构造的索引将是B-index。因此,不需要每次都以线性顺序(O(N))查找列表。您可以按O(log(n))顺序找到结果。此外,还有一种更好的数据结构,如trie
,你可以在O(1)中找到结果。你能给我一个这样的例子吗?@MarcRasmussen键上构造的索引是B-index。因此,不需要每次都以线性顺序(O(N))查找列表。您可以按O(log(n))顺序找到结果。此外,还有更好的数据结构,例如trie
,您可以在O(1)中找到结果。