2013-04-03 65 views
2

這裏收集是使用匿名委託要搜索的特性集合在我的應用程序當前代碼:匿名委託 - 搜索屬性與對象

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屬性。我將如何修改匿名代理中的代碼來完成此操作?

回答

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() 
+0

我仍然想保留它作爲MyObject數據類型,但是搜索MyObject對象的SubObject屬性 – 2013-04-03 20:37:09

+0

MichaelKniskern修復了它,所以searchResult仍然是LINQ情況下的List JaredPar 2013-04-03 20:38:11

1

試試這個,使用lambda表達式。基本上,如果至少有一個子對象包含所需的輸入,則會找到一個對象。

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

這看起來可能被下調了不少,但你需要擺脫null分配到列表:代替

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

.Clear()你的列表抵消他們的,更一致設計和更少的空檢查。