【问题标题】:Find object in list with specific value在列表中查找具有特定值的对象
【发布时间】:2018-08-05 14:27:43
【问题描述】:

我有这门课:

public class Person
{
    public String name;
    public int score;
    public float multiplier;

    public Person(String nameID)
    {
        name = nameID;
        score = 0;
        multiplier = 1.0f;
    }
}

我有一个包含这些类的列表:

private List<Person> _people;

有什么方法可以让我使用这样的名字获得分数吗?

_people.GetScore("example name"); // return the score of the class containing that name?

【问题讨论】:

标签: c# list class object


【解决方案1】:

使用 LINQ:

_people.FirstOrDefault(c => c.name == "example name")?.score;

别忘了先将using System.Linq; 添加到您的using 指令中。另请注意,您还需要使用Null-conditional 运算符(?.),用于在执行成员访问之前测试null(在这种情况下为score) 另外最好使用properties 而不是字段:

public string Name { get; set; }

【讨论】:

  • 如果在列表中找不到该名称?
  • @Rotem 谢谢。检查我更新的答案和? 操作员。
  • @S.Akbari 谢谢,我会研究一下 Linq。我是 C# 新手,{ 得到什么;放; } 做吗?
  • @JamesA 它们是自动实现的属性。阅读此docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
【解决方案2】:

您可以使用 linq 查询来获取结果:

int result = _people.FirstOrDefault(p => p.name == "example name").score

如果 _people 列表包含多个名称为“示例名称”的记录,那么您可以使用 where 子句并从列表中获取所有结果

var results = _people.Where(p => p.name == "example name");
    foreach(var r in results)
        Console.WriteLine(r.score);

现在您可以遍历结果以获取所有分数

这里是实现:DotNetFiddler

【讨论】:

  • Where 返回过滤后的IEnumerable,而不是单个结果。
  • 感谢@Rotem,我对其进行了更正。 FirstOrDefault 比 where 更精确
  • @Rotem,我使用了FirstOrDefaultWhere 子句。感谢您的建议
【解决方案3】:

你可以SingleIEnumerable的方法

var score = _people.Single(p => p.name == "example name").score

【讨论】:

  • a Single 方法只有在样本中有一个且只有一个元素的谓词时才能使用
  • 我认为name 是播放器的主键。可以存在两个同名玩家吗?
  • 有时可以。所以可能没有那个名字的玩家,因为例如他还没有出现在游戏中。
猜你喜欢
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
相关资源
最近更新 更多