【问题标题】:How do I get an object from a list where a property of that object matches a certain value?如何从该对象的属性与某个值匹配的列表中获取对象?
【发布时间】:2015-04-18 19:38:32
【问题描述】:

假设我有一个类Person,它有一个int 类型的属性PersonId,还有一个类Company,它有一个Persons 类型的属性List<Person>。我还有一个名为company1Company 对象。代码如下:

class Company
{
    public List<Person> Persons { get; private set; }

    public Company()
    {
        this.Persons = new List<Person>();
    }
}

class Person
{
    public int PersonId { get; set; }
}

// In a different class
public static Company company1 = new Company();

我需要返回Persons 列表中的Person 对象,其属性PersonIdselectedPersonId 给出的某个值匹配。

这是我目前用来执行此操作的代码:

Person person1;
int personIndex = company1.FindPersonIndexById(selectedPersonId);
if (personIndex != -1)
{
    person1 = company1.Persons[personIndex];
}

其中FindPersonIndexById(int)Company 类中的一个方法:

public int FindPersonIndexById(int personId)
{
    for (int i = 0; i < Persons.Count(); i++)
    {
        if (Persons[i].PersonId == personId)
        {
            return i;
        }
    }
    return -1;
}

这是从一个对象的属性与某个值匹配的列表中获取对象的最佳方法,还是有更好或更简洁的方法?
我不确定这是否类似于这个问题:Check whether a List of object has a node which matches a given property of that object

【问题讨论】:

    标签: c# list object search properties


    【解决方案1】:

    我会使用 Linq 来完成这项工作:

    var personIWantToFind = Persons.SingleOrDefault(x => x.PersonId == personId);
    

    【讨论】:

      【解决方案2】:

      更简洁的是:

      Person person = company1.Persons.Where(p=>p.PersonId == myValue).FirstOrDefault();
      

      这需要using System.Linq; 指令

      编辑:谢谢你,D 斯坦利

      【讨论】:

      • 您对var 的使用隐藏了Where 返回对象的collection 的事实,而不是像OP 想要的single 对象.
      • 请记住,如果找不到具有该 id 的人,则将返回 null
      【解决方案3】:

      另一种选择是使用FirstOrDefault()

      Person person1 = Persons.FirstOrDefault(p => p.PersonId = selectedPersonId);
      

      这(正如Mihai Carcostea 指出的那样)需要添加using System.Linq

      注意:如果在列表中找不到具有指定 ID 的人,person1 将是 null

      【讨论】:

      • Where 将返回对象的collection。我想你想要FirstFirstOrDefault
      • 对于这个问题你不想使用FirstOrDefault 在这个用例中,我们只是根据主键从数据库中搜索单行数据,如果你使用SingleOrDefault你指定只应返回一行,但如果再有行返回(主要数据错误),它将引发异常。但是,如果您使用FirstOrDefault,它可能会找到 2 行(这又是一个数据错误),但它只会返回第一行,没有任何异常。
      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2017-06-29
      • 2021-12-05
      相关资源
      最近更新 更多