遍历列表对象以查找具有匹配 属性 值的对象

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));
}