我有一个名为ServiceFormFields的自定义列表,它有一个名为ChildrenTables的List属性。
我想以ChildrenTables的名字命名降序
var fields = activeForm.ServiceFormFields.OrderBy (o =>
o.ChildrenTables.OrderBy(c=>c)).ToList();
但它不起作用。
我想根据其子代订购ServiceFormFields列表。也许我应该对GroupBy做.. ..
所以,例如......
ServiceFormFields具有FieldName属性..而Children是一个String列表
所以,我想订购如下: 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 ..
答案 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);
}
}
}
输出:
答案 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
}
}
在这种情况下,您将返回一个有序列表