问题是如何从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;
}
答案 0 :(得分:8)
使用LINQ:
List<F_object> found = f_objects.Where(obj => obj.GetName() == name).ToList();
这是所有匹配对象的列表。
编辑:符文FS的回答也提供了很好的建议,如果您期望或只关心抓住一个不同的.Single()
或.First()
而不是.Where()
值。
答案 1 :(得分:7)
在linq中有多种方法可以做到这一点。
第一个是使用.Where
。如果可以有更多匹配,这将满足您的需求
IEnumerable<F_object> result = f_objects.Where(obj=>obj.GetName() == name);
第二个选项是,如果您只关注第一个匹配,即使可能有多个,在这种情况下使用.First
f_object result = f_objects.First(obj=>obj.GetName() == name);
或者如果零点击是可接受的情况(非例外)
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);
答案 2 :(得分:4)
List<...> items = ... ;
string name = ...;
var found = items.Find( i => string.Equals(name, i.GetName()) );
答案 3 :(得分:3)
您可以使用LINQ。
var objectswith_something = f_objects.Where(fo => fo.GetName().Equals(name));
如果您只想要第一个,请使用
f_objects.Where(fo => fo.GetName().Equals(name)).FirstOrDefault();`
答案 4 :(得分:3)
仍然有人不能在他们的项目中使用LINQ,所以这里是没有它的版本:
F_object found = f_objects.Find(delegate(F_object f)
{
return f.GetName().Equals(name);
});
答案 5 :(得分:2)
最好的方法是使用Linq表达式进行搜索,假设您使用的是3.5或更高版本。
例如你会写
IEnumerable<F_object> filteredListOff_objects f_objects.Where(f_object=>f_object.GetName() == "something");
获取名称为“something”
的对象的IEnumberable答案 6 :(得分:0)
使用查询语法的另一个版本。我认为这比具有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&lt;&gt;或带有ToList或ToArray的数组。