2012-07-06 42 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)