如何在列表中搜索对象有它的字段值

本文关键字:对象 字段 搜索 列表 object | 更新日期: 2023-09-27 18:15:47

问题是如何从List中获得具有其字段值的对象

我有一个名为f_objects的列表,里面装满了对象。

private List<F_object> f_objects;

我也有一个字符串与一些值:

string name = "something";

F_object得到一个方法返回它的字段name:

public string GetName()
{
    return this.name;
}

是否有一个内置的方法来比较列表中的对象与这个字段的值?或者我应该像这样做一个循环和比较:

foreach(F_object ob in f_objects)
{
    if String.Equals(name, ob.GetName())
    F_object found = ob;
} 

如何在列表<object>中搜索对象有它的字段值

Using LINQ:

List<F_object> found = f_objects.Where(obj => obj.GetName() == name).ToList();

这是所有匹配对象的列表。

编辑: Rune FS的回答也有很好的建议使用.Single().First()而不是.Where(),如果你期望或只关心抓取一个不同的值

在linq中有多种方法可以做到这一点。第一个是使用.Where。如果有更多的匹配,这将满足您的需求

IEnumerable<F_object> result = f_objects.Where(obj=>obj.GetName() == name);

第二个选择是,如果你只关心第一次命中,即使可能有多个命中,在这种情况下,使用.First

f_object result = f_objects.First(obj=>obj.GetName() == name);

或者如果0命中是可接受的情况(非异常)

f_object result = f_objects.FirstOrDefault(Obj=>obj.GetName() == name);

如果你只需要点击一次,那么使用.Single

f_object result = f_objects.Single(obj=>obj.GetName() == name);

或者如果只能有一个或零命中,则使用.SingleOrDefault

f_object result = f_objects.SingleOrDefault(obj=>obj.GetName() == name);
List<...> items = ... ;
string name = ...;
var found = items.Find( i => string.Equals(name, i.GetName()) );

您可以使用LINQ。

var objectswith_something = f_objects.Where(fo => fo.GetName().Equals(name));

如果你只需要前者,使用

f_objects.Where(fo => fo.GetName().Equals(name)).FirstOrDefault();`

仍然有人不能在他们的项目中使用LINQ,所以这里是没有它的版本:

F_object found = f_objects.Find(delegate(F_object f)
{
    return f.GetName().Equals(name);
});

最好的方法是使用Linq表达式搜索,假设您使用3.5或以上版本。

例如你可以写

IEnumerable<F_object> filteredListOff_objects f_objects.Where(f_object=>f_object.GetName() == "something");

获取名称为"something"的对象的IEnumberable

使用查询语法的另一个版本。我认为这比使用lambda表达式的代码更具可读性。最后,它将是相同的。

string name = "something";
var foundQuery = from s in f_objects
                 where s.Name == name
                 select s;

我将声明一个属性Name而不是GetName()。然后可以在查询上使用foreach进行迭代:

foreach (string s in foundQuery)
   ...

或将其转换为List<>或带有ToList或ToArray的Array。