以下是我的应用程序中使用匿名委托搜索属性集合的当前代码:
public class MyObject
{
public MyObject() { }
public string MyObjectId { get; set; }
public List<MySubObject> SubObjects { get; set; }
}
public class MySubObject
{
public MySubObject() { }
public string MySubObjectId { get; set; }
}
public List<MyObject> Search(string input)
{
List<MyObject> AllObjects = Data.GetAllObjects();
List<MyObject> SearchResults = new List<MyObject>();
SearchResults = AllObjects.FindAll
(
delegate(MyObject o)
{
return e.MyObjectId.Equals(input)
}
);
if (SearchResults .Count.Equals(0))
SearchResults = null;
return SearchResults ;
}
我想修改匿名委托,以便通过通用列表中的MySubObject.MySubObjectId
属性而不是MyObjectId
属性进行搜索。我如何修改匿名委托中的代码来完成此任务?
答案 0 :(得分:1)
尝试以下
delegate(MyObject o) {
var mySubObject = o as MySubObject;
return mySubObject != null && mySubObject.MySubObjectId == input;
}
请注意,您也可以在这里使用更短的lambda语法
(o) => {
var mySubObject = o as MySubObject;
return mySubObject != null && mySubObject.MySubObjectId == input;
}
或LINQ查询
var searchResult = AllObjects
.OfType<MySubObject>()
.Where(x => x.MySubObjectId == input)
.Cast<MyObject>()
.ToList()
答案 1 :(得分:1)
尝试使用lambda表达式。基本上,如果至少有一个子对象包含所需的输入,则会找到该对象。
SearchResults = AllObjects.Where(obj =>
obj.SubObjects != null
&& obj.SubObjects.Any(subObj => ubObj.MySubObjectId.Equals(input))
).ToList();
答案 2 :(得分:1)
这看起来可能会被削减很多,但你需要摆脱列表的null
分配:
public List<MyObject> Search(string input)
{
return Data.GetAllObjects()
.Where(obj => obj.SubObjects
.Any(subobj => subobj.SubOjectId.Equals(input)));
}
.Clear()
您的列表,而不是取消它们,以获得更一致的设计和更少的空值检查。