通过内部列表
问题描述:
的性能动态排序我有这样的结构:通过内部列表
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> RecordsToSort
和List<int> SortByFieldIds
并返回我的记录的排序列表。请帮帮我。
答
您可以使用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
对记录列表进行排序10List<Record> sortByRecordId = list.OrderBy(r => r.Id).ToList();
请记住,包括
using System.Linq;
答
既然你提到你有一个List<int>
的ID我假设你想做一个 基于这些ID对List<Field>
的Records
Field
&的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)
的代码,我不需要按Field.Id排序,但首先我必须得到正确的字段(使用字段。Id),然后按此字段值(Field.Value)对记录进行排序。 – Poniat 2012-07-06 06:03:21
@Poniat,检查编辑后的答案 – Habib 2012-07-06 06:12:27