C# 使用Linq或Lambda比较嵌套集合中的项

C# 使用Linq或Lambda比较嵌套集合中的项,c#,linq,list,lambda,nested-lists,C#,Linq,List,Lambda,Nested Lists,我有一个物体看起来像这样 对象 名字 身份证 PropertyGroupList[] PropertyGroupListItem PropertyList[] 属性列表项 标签 类型 属性列表项 标签 类型 PropertyGroupListItem PropertyList[] 属性列表项 标签 类型 属性列表项 标签 类型 每个对象都有一个PropertyListItem,其中标记为“Revision”。我需要将“Revision”的值与列表中存储的所

我有一个物体看起来像这样

对象

  • 名字
  • 身份证
  • PropertyGroupList[]
    • PropertyGroupListItem
      • PropertyList[]
        • 属性列表项
          • 标签
          • 类型
        • 属性列表项
          • 标签
          • 类型
    • PropertyGroupListItem
      • PropertyList[]
        • 属性列表项
          • 标签
          • 类型
        • 属性列表项
          • 标签
          • 类型
每个对象都有一个PropertyListItem,其中标记为“Revision”。我需要将“Revision”的值与列表中存储的所有其他对象进行比较,并返回“Revision”值最高的项目

我想我可以为循环构建一种嵌套的
方法,但我认为使用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!");
                }
        }
    }
公共MdsObject GetSoftwareObjectByName(字符串sPackageName) { GetObjectListRequest getObjectListReq=新的GetObjectListRequest(); 初始化请求(getObjectListReq); //TODO:在到DSM的LDAP查询中是否有更多需要转义的字符? sPackageName=sPackageName.Replace(“(”,“\\(”); sPackageName=sPackageName.Replace(“)”,“\\)”; getObjectListReq.LdapQuery=“;(名称:IgnoreCase=“+sPackageName+”);子树”; getObjectListReq.MaxResults=-1; GetObjectListReply GetObjectListReply=AdministrationService.GetObjectList(getObjectListReq); 开关(getObjectListReply.ObjectList.Length) { 案例0: {抛出新的ApplicationException(“GetSoftwareObjectByName失败。找不到“+sPackageName+””);} 案例1: { MdsObject uncompleteObjectFromLDAP=getObjectListReply.ObjectList[0]; 返回GetSoftwareObjectById(不完全ObjectFromLDAP.ID); } //返回了多个对象->检查修订 违约: { List ListReturnedObject=新列表();
对于(inti=1;i,首先将嵌套层次结构平铺为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.

帮助您处理示例代码、示例输入和示例输出会容易得多…从visual studio复制对象并保持所有内容可读性的最佳方法是什么?