如何在List <object>中搜索具有其字段值</object>的对象

时间:2011-11-23 21:00:35

标签: c# oop list object

问题是如何从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;
} 

7 个答案:

答案 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的数组。