C#中的嵌套列表顺序

时间:2015-07-29 09:28:03

标签: c#

我有一个名为ServiceFormFields的自定义列表,它有一个名为ChildrenTables的List属性。

我想以ChildrenTables的名字命名降序

var fields = activeForm.ServiceFormFields.OrderBy (o => 
 o.ChildrenTables.OrderBy(c=>c)).ToList();

但它不起作用。

我想根据其子代订购ServiceFormFields列表。也许我应该对GroupBy做.. ..

所以,例如......

ServiceFormFields具有FieldName属性..而Children是一个String列表

  1. FieldName = Matter,Children = Version
  2. FieldName = Client,Children = Matter
  3. FieldName = Status,Children = Null
  4. FieldName = Version,Children = Null(但有父母,很重要)
  5. 所以,我想订购如下: 2,1,3,4

    因为客户端是最高级别,第二级是Matter,第三级是Version,因为Matter是其父级,而final是Status,因为它没有任何依赖性。

    编辑:这是类的结构

    public class ServiceForm
    {
        public List<ServiceFormField> ServiceFormFields { get; set; }
    
        public string Id {  get; set; }
    
        public bool IsDefaultPrimary { get; set; }
    
        public string Name  { get; set; }
    
        public string Title { get; set; }
    
        public string Type  { get; set; }
    
    }
    
    
    public class ServiceFormField
    {
    
        public FormProperty FormField {get;set;}
        public bool IsVisible { get;set;}
        public List<string> ParentTables {  get; set; }
        public bool HasChildren { get; set; }
        public List<string> ChildrenTables { get; set;  }
    
    }
    
    
    public partial class FormProperty 
    {               
    
        private string NameField;
    
        private string SQLInfoField;
    
        ...
    
     }
    

    NameField包含Client,Matter,Version ..

2 个答案:

答案 0 :(得分:0)

我不知道这是否是您想要的,但这是一个需要最少代码的解决方案。

我只是把所有的儿童变成了一个单独的字符串,然后通过比较它们的顺序。

如果这很重要,这当然不是性能最佳的解决方案。

这是一个样本:

static void Main(string[] args)
{
    ServiceForm sf = new ServiceForm();
    sf.ServiceFormFields = new List<ServiceFormField> 
    { 
        new ServiceFormField { ChildrenTables = new List<string> { "a", "b", "c"}},
        new ServiceFormField { ChildrenTables = new List<string> { "tra la la", "xxx"}},
        new ServiceFormField { ChildrenTables = new List<string> { "TTTTT" }},
        new ServiceFormField { ChildrenTables = new List<string> { "123455", "8157125", "1763123"}},
        new ServiceFormField { ChildrenTables = new List<string> { " ", " ", " ", "   "}}
    };

    var ordered= sf.ServiceFormFields.OrderByDescending(f => string.Join(",", f.ChildrenTables)).ToList();
    foreach(ServiceFormField sff in ordered)
    {
        foreach(string s in sff.ChildrenTables)
        {
            Console.WriteLine(s);
        }
    }
}

输出:

enter image description here

答案 1 :(得分:0)

有两种方法,首先你可以使用List.Sort函数和签名比较,如:

activeForm.ServiceFormFields.Sort(new Comparison<ServiceFormField>((e1,e2)=>Compare(e1, e2)));

private static int Compare(ServiceFormField e1, ServiceFormField e2)
{
    //Do your logic here      
}

在这种情况下,您将进行原位排序。

或使用带有KeySelector签名的linq orderby函数,IComparer并实现类似的IComparer

var result = activeForm.ServiceFormFields.OrderBy(e =&gt; e,new ServiceFormFieldComparer());

public class ServiceFormFieldComparer : IComparer<ServiceFormField>
{
   private int Compare(ServiceFormField e1, ServiceFormField e2)
   {
      //Your logic here
   }      
}

在这种情况下,您将返回一个有序列表