2012-07-06 77 views
0

的性能动态排序我有这样的结构:通过内部列表

public class Record 
{ 
    public int Id { get; set; } 
    public List <Field> Fields; 
} 

public class Field 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

因此,它是代表与场记录我的自定义类。

现在,我有很多记录List<Record> Records,我希望能够通过字段值(从Field.Value)对记录进行排序。

因为Field类包含Id属性我有一个列表(List<int> SortByFieldIds),它显示了我必须使用哪些字段进行排序。

我的问题是,我不知道如何处理它。我不知道如何写一个方法,需要一个List<Record> RecordsToSortList<int> SortByFieldIds并返回我的记录的排序列表。请帮帮我。

回答

0

您可以使用LINQ对列表进行排序。喜欢的东西:

List<Record> list = new List<Record>(); 
List<Record> SortByFieldIds = list.OrderBy(r => r.Fields.Select(a => a.Id)).ToList(); 

编辑

如果你想基于价值尝试搜索的ID,然后再排序:

int yourFieldID = 0;//this will hold your Field.ID 
List<Record> sortByFieldId = list.OrderBy(
              r => r.Fields.Where(
              a => a.Id == yourFieldID 
             ).FirstOrDefault().Value).ToList(); 

编辑完

要根据ID

对记录列表进行排序10
List<Record> sortByRecordId = list.OrderBy(r => r.Id).ToList(); 

请记住,包括

using System.Linq; 
+0

的代码,我不需要按Field.Id排序,但首先我必须得到正确的字段(使用字段。Id),然后按此字段值(Field.Value)对记录进行排序。 – Poniat 2012-07-06 06:03:21

+0

@Poniat,检查编辑后的答案 – Habib 2012-07-06 06:12:27

0

您可以使用LINQ OrderBy

您可以在一流水平SortByFieldIds,并通过IComparer来排序依据

0

既然你提到你有一个List<int>的ID我假设你想做一个 基于这些ID对List<Field>RecordsField &的ID属性最终根据ID对字段进行排序。

因此,例如,如果有2个记录

record 1 has 3 fields with IDs (1,2,3) 
record 2 had 4 fields with IDs (4,3,6,2) 
现在

如果List<int>6,2,3所需的记录与那些使用标识6,2,3场返回值和领域亟待​​解决为每个记录。

于是用例子情况下,你的结果会是

record 1 has 3 fields with IDs (2,3) 
record 2 had 4 fields with IDS (2,3,6) 

如果这是一个你那么这里之后是一个实际的例子

 List<Field> fields1 = new List<Field>(); 
     fields1.Add(new Field() { Id = 1, Name = "ONE", Value = "one" }); 
     fields1.Add(new Field() { Id = 2, Name = "TWO", Value = "two" }); 
     fields1.Add(new Field() { Id = 3, Name = "THREE", Value = "three" }); 

     List<Field> fields2 = new List<Field>(); 
     fields2.Add(new Field() { Id = 4, Name = "FOUR", Value = "four" });    
     fields2.Add(new Field() { Id = 3, Name = "THREE", Value = "three" }); 
     fields2.Add(new Field() { Id = 6, Name = "SIX", Value = "six" }); 
     fields2.Add(new Field() { Id = 2, Name = "TWO", Value = "two" }); 

     records.Add(new Record() { Id = 1, Fields = fields1 }); 
     records.Add(new Record() { Id = 2, Fields = fields2 }); 

     //You did mention that you already have this 
     List<int> SortByFieldIds = new List<int>(); 
     SortByFieldIds.AddRange(new List<int> { 6, 2, 3 }); 


     //before foreach loop records will have 2 records (record1 with fields 1,2,3 and record2 with fields 4,3,6,2) 

     foreach (Record r in records) 
     { 
      r.Fields = r.Fields.Where(f => SortByFieldIds.Contains(f.Id)).OrderBy(f => f.Id).ToList(); 
     } 

     //after foreach loop records will have 2 records (record1 with fields 2,3 and record2 with fields 2,3,6)