在列表中查找具有特定值的对象
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,我使用了FirstOrDefault
和Where
子句。感谢您的建议【参考方案3】:
你可以Single
IEnumerable
的方法
var score = _people.Single(p => p.name == "example name").score
【讨论】:
aSingle
方法只有在样本中有一个且只有一个元素的谓词时才能使用
我认为name
是播放器的主键。可以存在两个同名玩家吗?
有时可以。所以可能没有那个名字的玩家,因为例如他还没有出现在游戏中。以上是关于在列表中查找具有特定值的对象的主要内容,如果未能解决你的问题,请参考以下文章
Grails:查找具有列表属性的对象,其中包含具有给定属性值的对象