【问题标题】:Anonymous Delegate - Search property with collection of objects匿名委托 - 使用对象集合搜索属性
【发布时间】:2013-04-03 20:30:41
【问题描述】:

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

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

【问题讨论】:

    标签: c# anonymous-methods


    【解决方案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()
    

    【讨论】:

    • 我仍然想将其保留为MyObject 数据类型,但在MyObject 对象的SubObjects 属性上搜索
    • @MichaelKniskern 修复了它,所以在 LINQ 案例中 searchResult 仍然是 List&lt;MyObject&gt;
    【解决方案2】:

    试试这个,使用 lambda 表达式。如果至少有一个子对象包含所需的输入,则基本上可以找到一个对象。

    SearchResults = AllObjects.Where(obj => 
        obj.SubObjects != null 
        && obj.SubObjects.Any(subObj => ubObj.MySubObjectId.Equals(input))
    ).ToList();
    

    【讨论】:

      【解决方案3】:

      这看起来可以减少很多,但您需要摆脱列表中的null 分配:

      public List<MyObject> Search(string input)
      {
          return Data.GetAllObjects()
              .Where(obj => obj.SubObjects
                  .Any(subobj => subobj.SubOjectId.Equals(input)));
      }
      

      .Clear() 你的列表而不是使它们无效,以获得更一致的设计和更少的 null 检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        相关资源
        最近更新 更多