使用linq c#基于状态对列表进行排序

时间:2013-09-18 18:48:10

标签: c# linq list sorting

任何人都可以帮我解决这个问题。,,

我有一个需要根据状态列排序的List。 样本清单。

IList<Letters> lstLetterSummary = new List<Letters>();

字母datacontract

public class ERDRMessageSummary
{
    [DataMember(IsRequired = true, Order = 1)]
    public string LetterId{ get; set; }

    [DataMember(IsRequired = true, Order = 2)]
    public int MessageId { get; set; }

    [DataMember(IsRequired = true, Order = 3)]
    public string MessageType { get; set; }

    [DataMember(IsRequired = true, Order = 4)]
    public DateTime RegisteredDate { get; set; }

    [DataMember(IsRequired = true, Order = 5)]
    public string Status { get; set; }

    [DataMember(IsRequired = true, Order = 7)]
    public string FirstName { get; set; }

    [DataMember(IsRequired = true, Order = 8)]
    public string LastName { get; set; }

     }

该列表包含一个名为status的成员,您可以在合同中看到,值可以是: 1.Registered。 2.等待发送。 3.Sent。 4.Rejected。

列表需要根据状态值进行排序,并且应该按以下顺序排列。 1.Rejected。 2.等待发送。 3.sent。 4.registered。

我正在使用c#和linq ..

任何帮助都会非常感激..

3 个答案:

答案 0 :(得分:3)

这个怎么样?

string[] statuses = { "Rejected", "Waiting", "To send", "Sent", "Registered" }; 
Dictionary<string, int> OrderingDictionary =
  statuses
  .Select((x, i) => new { x, i })
  .ToDictionary(z => z.x, z => z.i);

List<string> orderedData =
  lstLetterSummary
  .OrderBy(s => OrderingDictionary[s])
  .ToList();

答案 1 :(得分:3)

这个怎么样?这很简单:)

string[] statuses = { "Rejected", "Waiting to send", "Sent", "Registered" };
lstLetterSummary.Sort((x, y) =>
{
     return Array.IndexOf(statuses, x.Status).CompareTo(Array.IndexOf(statuses, y.Status));
});

答案 2 :(得分:2)

首先定义一个方法,将您的状态字符串转换为与所需顺序对应的数值:

int GetStatusOrder(string status)
{
    switch (status)
    {
        case "Rejected"        : return 1;
        case "Waiting to sent" : return 2;
        case "Sent"            : return 3;
        case "Registered"      : return 4;
        default                : return 5;
    }
}

然后,您可以使用LINQ OrderBy运算符并调用此方法:

var sortedList = myList.OrderBy(l => GetStatusOrder(l.Status)).ToList();

当你无法改变你的课程时,这只是一个快速而肮脏的解决方案。如果可能,您应该将Status字段的类型从字符串转换为枚举类型。