2

有人能帮我解决这个问题吗?,,

我有一个需要根据状态列进行排序的列表。样品清单。

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

信件数据合同

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.发送。4.拒绝。

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

我为此使用 c# 和 linq。

任何帮助将非常感激..

4

3 回答 3

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));
});
于 2013-09-18T19:06:00.717 回答
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();
于 2013-09-18T18:53:03.243 回答
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;
    }
}

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

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

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

于 2013-09-18T18:54:17.880 回答