如何通过getName()查找List<Usuario>元素?遇类型转换错误
问题解决:List查找匹配名称元素的错误修正
错误原因
list.IndexOf(buscarItem)报错是因为List<Usuario>的IndexOf方法要求传入Usuario类型的对象,但你传入了字符串,编译器无法完成类型转换,所以抛出错误。
正确实现方法
方法1:使用FindIndex结合Lambda表达式(推荐)
直接修改EncontrarItem方法,通过Lambda表达式匹配Usuario的name属性:
private int EncontrarItem(String buscarItem) { // 查找第一个name与目标字符串匹配的元素索引,找不到返回-1 return list.FindIndex(u => u.getName() == buscarItem); }
原onFile方法无需修改,可直接正常运行。
方法2:直接用Any方法简化判断(更简洁)
如果仅需要判断元素是否存在,不需要获取索引,可以直接简化onFile方法,省去EncontrarItem:
public Boolean onFile(String buscarItem) { // 检查集合中是否存在name匹配的元素 return list.Any(u => u.getName() == buscarItem); }
方法3:通过重写相等比较实现IndexOf(适合多场景相等判断)
如果需要在多处按name判断Usuario是否相等,可以给Usuario类实现IEquatable<Usuario>接口并重写相等方法:
修改Usuario类代码:
namespace ElMaestro { internal class Usuario : IEquatable<Usuario> { private String name { get; set; } private int score { get; set; } private String course { get; set; } public Usuario(String name, int score, String course) { this.name = name; this.score = score; this.course = course; } public String getName() => name; public override string ToString() => "\n Nombre del usuario: " + name + "\n Puntaje del curso: " + score + "\n Estado del curso: " + course; public override bool Equals(object obj) { return Equals(obj as Usuario); } public bool Equals(Usuario other) { return other != null && name == other.name; } public override int GetHashCode() { return name.GetHashCode(); } } }
之后可以创建临时对象调用IndexOf:
private int EncontrarItem(String buscarItem) { // 创建仅包含目标name的临时Usuario对象 var tempUsuario = new Usuario(buscarItem, 0, ""); return list.IndexOf(tempUsuario); }
内容的提问来源于stack exchange,提问作者Bayunas
相关产品推荐
相关产品推荐

