C# 匿名委托-使用对象集合搜索属性

C# 匿名委托-使用对象集合搜索属性,c#,anonymous-methods,C#,Anonymous Methods,以下是我的应用程序中使用匿名委托搜索属性集合的当前代码: public class MyObject { public MyObject() { } public string MyObjectId { get; set; } public List<MySubObject> SubObjects { get; set; } } public class MySubObject { public MySubObject() { } pub

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

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 ;
}
公共类MyObject
{
公共MyObject(){}
公共字符串MyObjectId{get;set;}
公共列表子对象{get;set;}
}
公共类MySubObject
{
public MySubObject(){}
公共字符串MySubObjectId{get;set;}
}
公共列表搜索(字符串输入)
{
List AllObjects=Data.GetAllObjects();
列表搜索结果=新列表();
SearchResults=AllObjects.FindAll
(
代表(MyObject o)
{
返回e.MyObjectId.Equals(输入)
}
);
if(SearchResults.Count.Equals(0))
SearchResults=null;
返回搜索结果;
}
我想修改匿名委托,以通过泛型列表中的
MySubObject.MySubObjectId
属性而不是
MyObjectId
属性进行搜索。如何修改匿名委托中的代码以实现此目的?

请尝试以下操作

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()
var searchResult=AllObjects
第()类
.Where(x=>x.MySubObjectId==input)
.Cast()
托利斯先生()

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

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

这看起来可能会被削减很多,但您需要去掉列表中的
null
赋值:

public List<MyObject> Search(string input)
{
    return Data.GetAllObjects()
        .Where(obj => obj.SubObjects
            .Any(subobj => subobj.SubOjectId.Equals(input)));
}
公共列表搜索(字符串输入)
{
返回数据。GetAllObjects()
.Where(obj=>obj.SubObjects
.Any(subobj=>subobj.subobjectid.Equals(输入));
}

.Clear()
您的列表,而不是使其无效,用于更一致的设计和更少的空检查。

我仍然希望将其作为
MyObject
数据类型保留,但在
MyObject的
子对象
属性上搜索object@MichaelKniskern修复了它,因此在LINQ情况下,searchResult仍然是
列表