匿名委托 - 具有对象集合的搜索属性

时间:2013-04-03 20:30:42

标签: c# anonymous-methods

以下是我的应用程序中使用匿名委托搜索属性集合的当前代码:

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属性进行搜索。我如何修改匿名委托中的代码来完成此任务?

3 个答案:

答案 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()您的列表,而不是取消它们,以获得更一致的设计和更少的空值检查。