遍历列表对象以查找具有匹配 属性 值的对象
Iterate through list objects to find object with matching property value
我有一个 class(用户)的对象(用户)列表。现在我尝试检索具有特定 属性 值(例如字符串用户名 = 名称)的(唯一)对象。所以需要 returned 的是对象,基于其 属性.
的值
这里问了几个类似的问题,但none似乎return整个对象。
我试过几种方法,包括这个:
public User GetUser(string name)
{
User currentUser;
for(int i = 0; i < this.users.Count; i++)
{
if (users[i].GetName().Equals(name))
{
users[i] = currentUser;
}
};
return currentUser;
}
这里的一个问题是 currentUser 不被接受为变量。解决此问题的更好方法是什么?
编辑:
如答案中所述,此问题的最快解决方案是使用 LINQ。还指出有一种方法可以改进我的代码,以便在不使用 LINQ 的情况下达到相同的结果,如下所示:
public User GetUser(string name)
{
User currentUser = null;
for (int i = 0; i < this.users.Count; i++)
{
if (users[i].GetName().Equals(name))
{
currentUser = users[i];
}
};
return currentUser;
}
如果有多个用户的 GetName 等于名称,此方法将 return 最后一个这样的用户。
// is optional, if you want ignore case
// users[i].GetName().Equals(name, StringComparison.InvariantCultureIgnoreCase)
public User? GetUser(string name)
{
for(int i = 0; i < this.users.Count; i++)
if (users[i].GetName().Equals(name))
return users[i]; // early-return pattern
return null; // returns null if no such user found
}
不要忘记检查客户端代码中的空值:
var user = GetUser("SomeUserName");
if(user is null) {
// do some
}
如果你喜欢使用 linq:
public User? GetUser(string name) => users.FirstOrDefault(u => u.GetName().Equals(name));
获得所需内容的一种快速方法是使用 LinQ
var user = users.Where(user => user.GetName() == name).First();
或更短
var user = users.First(user => user.GetName() == name);
您可以使用 LINQ
:
public User GetUser(string name)
{
return users.FirstOrDefault(x => x.GetName().Equals(name));
}
注意:如果不存在这样的名称,则返回默认值,本例默认为null
.
看来你正在尝试这样做
var user = users.FirstOrDefault(u => u.GetName().Equals(name));
在用户对象中使用 getter 作为用户名代替 GetName
public User GetUser(string name)
{
return users.FirstOrDefault(u => u.GetName().Equals(name));
}
我有一个 class(用户)的对象(用户)列表。现在我尝试检索具有特定 属性 值(例如字符串用户名 = 名称)的(唯一)对象。所以需要 returned 的是对象,基于其 属性.
的值这里问了几个类似的问题,但none似乎return整个对象。
我试过几种方法,包括这个:
public User GetUser(string name)
{
User currentUser;
for(int i = 0; i < this.users.Count; i++)
{
if (users[i].GetName().Equals(name))
{
users[i] = currentUser;
}
};
return currentUser;
}
这里的一个问题是 currentUser 不被接受为变量。解决此问题的更好方法是什么?
编辑: 如答案中所述,此问题的最快解决方案是使用 LINQ。还指出有一种方法可以改进我的代码,以便在不使用 LINQ 的情况下达到相同的结果,如下所示:
public User GetUser(string name)
{
User currentUser = null;
for (int i = 0; i < this.users.Count; i++)
{
if (users[i].GetName().Equals(name))
{
currentUser = users[i];
}
};
return currentUser;
}
如果有多个用户的 GetName 等于名称,此方法将 return 最后一个这样的用户。
// is optional, if you want ignore case
// users[i].GetName().Equals(name, StringComparison.InvariantCultureIgnoreCase)
public User? GetUser(string name)
{
for(int i = 0; i < this.users.Count; i++)
if (users[i].GetName().Equals(name))
return users[i]; // early-return pattern
return null; // returns null if no such user found
}
不要忘记检查客户端代码中的空值:
var user = GetUser("SomeUserName");
if(user is null) {
// do some
}
如果你喜欢使用 linq:
public User? GetUser(string name) => users.FirstOrDefault(u => u.GetName().Equals(name));
获得所需内容的一种快速方法是使用 LinQ
var user = users.Where(user => user.GetName() == name).First();
或更短
var user = users.First(user => user.GetName() == name);
您可以使用 LINQ
:
public User GetUser(string name)
{
return users.FirstOrDefault(x => x.GetName().Equals(name));
}
注意:如果不存在这样的名称,则返回默认值,本例默认为null
.
看来你正在尝试这样做
var user = users.FirstOrDefault(u => u.GetName().Equals(name));
在用户对象中使用 getter 作为用户名代替 GetName
public User GetUser(string name)
{
return users.FirstOrDefault(u => u.GetName().Equals(name));
}