2015-03-03 105 views
0

我有一個對象,它看起來像這樣使用LINQ或λ在嵌套集合

對象

  • 名稱
  • ID
  • PropertyGroupList []
      比較項目
    • PropertyGroupListItem
      • 對propertyList []
        • PropertyListItem
          • 標籤
          • 類型
        • PropertyListItem
          • 標籤
          • 類型
    • PropertyGroupListItem
      • 對propertyList []
        • PropertyListItem
          • 標籤
          • 類型
        • PropertyListItem
          • 標籤
          • 類型
    • 這些對象的

每個人都有一個PropertyListIte m標籤是「修訂」的地方。我需要「修正」的價值與所有存儲在列表中的其他對象進行比較,並返回,其中「修訂」具有最高價值的項目。

我想我可以建立一個嵌套for循環的方式,但我認爲這將是一個更好的方法來通過使用Linq或Lambda表達式來獲取對象。

我一直試圖找到一種方法,自己做這一點,但我覺得我所做的是完全錯誤的一切。如果有人能夠幫助我並給出一些解釋,我會非常高興。非常感謝!

編輯:

示例代碼:

public MdsObject GetSoftwareObjectByName(string sPackageName) 
    { 
     GetObjectListRequest getObjectListReq = new GetObjectListRequest(); 
     InitializeRequest(getObjectListReq); 
     //TODO: Are there more characters which need to be escaped in an LDAP query to DSM? 
     sPackageName = sPackageName.Replace("(", "\\("); 
     sPackageName = sPackageName.Replace(")", "\\)"); 
     getObjectListReq.LdapQuery = "<LDAP://rootDSE>;(Name:IgnoreCase=" + sPackageName + ");;subtree"; 
     getObjectListReq.MaxResults = -1; 
     GetObjectListReply getObjectListReply = AdministrationService.GetObjectList(getObjectListReq); 

     switch (getObjectListReply.ObjectList.Length) 
     { 
      case 0: 
       { throw new ApplicationException("GetSoftwareObjectByName failed. Could not find '" + sPackageName + "'"); } 
      case 1: 
       { 
        MdsObject incompleteObjectFromLdap = getObjectListReply.ObjectList[0]; 
        return GetSoftwareObjectById(incompleteObjectFromLdap.ID); 
       } 
       //more than one object was returned -> check revisions 
      default: 
       { 
        List<MdsObject> ListReturnedObjects = new List<MdsObject>(); 

        for (int i = 1; i <= getObjectListReply.ObjectList.Length; i++) 
        { 
         MdsObject incompleteObjectFromLdap = getObjectListReply.ObjectList[i-1]; 
         ListReturnedObjects.Add(GetSoftwareObjectById(incompleteObjectFromLdap.ID)); 
        } 

        **Here I need to filter the objects** 

        throw new ApplicationException("GetSoftwareObjectByName failed. Software name '" + sPackageName + "' is not unique!"); 
       } 
     } 
    } 
+4

It用示例代碼,示例輸入和示例輸出來幫助你更容易... – 2015-03-03 13:50:31

+0

從Visual Studio複製對象並保持一切可讀性的最佳方法是什麼? – sevi 2015-03-03 14:03:15

回答

0

首先開始通過下調flatening您的嵌套層次爲IEnumerable

var q = MyObject.PropertyGroupList 
    .SelectMany(item=>item.PropertyList); // For every Item in the GroupList, Flatten it and return the individual PropertyListItem 

然後找到一個與最高版本

var q2 = q.OrderbyDescending(item=>item.Tag) // Order them by tag starting with the largest 
    .First(); // And get the first and thus biggest one.