在列表中查找具有特定值的对象

Posted

技术标签:

【中文标题】在列表中查找具有特定值的对象【英文标题】: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?

【问题讨论】:

GetScore 是从哪里来的? Filtering collections in C#的可能重复 @RahulAgarwal 这只是我想要的一个例子 【参考方案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 是播放器的主键。可以存在两个同名玩家吗? 有时可以。所以可能没有那个名字的玩家,因为例如他还没有出现在游戏中。

以上是关于在列表中查找具有特定值的对象的主要内容,如果未能解决你的问题,请参考以下文章

Grails:查找具有列表属性的对象,其中包含具有给定属性值的对象

在具有特定键的特定值的数组中查找对象的索引[重复]

在具有显式键值的对象列表中查找元素

如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?

JQ:查找具有特定属性值的对象的数组索引

如何根据查找具有特定值的实体在我的核心数据之间进行迭代