C#使用对象字段查找列表中的对象

时间:2017-05-13 17:38:55

标签: c# list linq

所以我有以下List

List<AttackStyle> AttackStyles = new List<AttackStyle>();

使用以下类型的对象:

AttackStyle lStyle = new AttackStyle();
lStyle.Name = "Attack Achilles";
lStyle.ParameterID = 0;
lStyle.Forward = Vector3.forward;
lStyle.HorizontalFOA = 70f;
lStyle.VerticalFOA = 40f;
lStyle.DamageModifier = 1f;
lStyle.ActionStyleAlias = "Jump";
lStyle.IsInterruptible = true;

AttackStyles.Add(lStyle);

现在我希望找到ParameterID等于某个值的字段ActionStyleAlias(例如"Jump"

这适用于Unity应用程序,因此搜索/查找需要尽可能快。

5 个答案:

答案 0 :(得分:3)

var result = AttackStyles.FirstOrDefault(x => x.ActionStyleAlias == "Jump").ParameterID;

答案 1 :(得分:1)

直接的解决方案是:

 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
                      });

然后,通过这个找到对象:

var pId = styles["Jump"].ParamterId;

或者如果它可能为null:

if(styles.Keys.Contains("Jump"))
    var pId = styles["Jump"].ParamterId;

答案 2 :(得分:1)

var param = AttackStyles.First(x => x.ActionStyleAlias.Equals(value)).ParameterID;

答案 3 :(得分:1)

如果系列中包含所需的项目,请先返回ParameterID;否则-1

 var result = AttackStyles
   .Where(item => item.ActionStyleAlias == "Jump")
   .Select(item => item.ParameterID)
   .DefaultIfEmpty(-1)
   .First();

答案 4 :(得分:0)

您可以尝试扩展方法。你也应该考虑空案例:

static class Extensions
{
    public static int? FindParameterId(this List<AttackStyle> values, string actionStyleAlias)
    {
        return values.FirstOrDefault(x => x.ActionStyleAlias == actionStyleAlias)?.ParameterID;
    }
}

然后使用它:

List<AttackStyle> attackStyles = new List<AttackStyle>();
var parameterId = attackStyles.FindParameterId("Jump");