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)中找到结果。