如何在列表
本文关键字:对象 字段 搜索 列表 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;
}
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。