C#.NET中某些顺序的订单列表

时间:2014-04-12 12:56:54

标签: c# .net list

我有一个由以下类组成的列表:

public class Category
        {
            public int id { get; set; }
            public string slug { get; set; }
            public string title { get; set; }
            public string description { get; set; }
            public int parent { get; set; }
            public int post_count { get; set; }
        }

这是清单。

List<Category> cats = new List<Category>();

我希望我可以根据id(int)对它进行排序,但按照一定的顺序我有:

3,17,13,176,4,177,179,178,180,181,182,183,184,185,186,139

有没有办法做到这一点?

谢谢。

4 个答案:

答案 0 :(得分:3)

好的,我假设你的意思是你想按顺序排序

3, 17, 13, 176, 4, 177, 179, 178, 180, 181, 182, 183, 184, 185, 186, 139

...而不是严格的数字顺序。

您可以在课程中添加SortOrder字段吗?

如果你不能,你可以模仿一个。创建一个具有两个属性的类,ID和SortOrder:

public class CategorySortOrder
{
    int CategoryId { get;set;}
    int SortOrder { get;set;}
}

按正确的顺序创建一个数组:

var catSortOrder = new[] {
   new CategorySortOrder() { CategoryId = 3, SortOrder = 1 },
   new CategorySortOrder() { CategoryId = 17, SortOrder = 2 }
   // etc.
   }

然后执行一些LINQ:

var catList = from cat in cats 
              join so in catSortOrder on cat.id = so.CategoryId
              select new {
                cat = cat,
                sort_order = so.SortOrder
              };
var finalist = catList
                  .OrderBy(item => item.SortOrder)
                  .Select(item => item.cat)
                  .ToList();

如果您的意思是您希望ID按数字顺序排列,则可以使用LINQ对它们进行排序,如下所示:

var catList = cats.OrderBy(cat => cat.id).ToList();

答案 1 :(得分:1)

有几种方法可以做到这一点:

答案 2 :(得分:1)

int[] orderData = new[] {3, 17, 13, 176, 4, 177, 179, 178, 180, 181, 182, 183, 184, 185, 186, 139};
List<Category> orderedCategories = cats.OrderBy(item => Array.IndexOf(orderData, item.id)).ToList();

答案 3 :(得分:0)

创建自定义Comparer

public class CategoryComparer : IComparer<Category>
{
    List<int> orderNums =
        new List<int> { 3, 17, 13, 176, 4, 177, 179, 178, 180, 181, 182, 183, 184, 185, 186, 139 };

    public int Compare(Category x, Category y)
    {
        var index1 = orderNums.IndexOf(x.id);
        var index2 = orderNums.IndexOf(y.id);

        if (index1 == index2)
            return 0;

        return index1 > index2 ? 1 : -1;
    }
}

然后Sort使用新的Comparer

列表
cats.Sort(new CategoryComparer());

或者使用LINQ保持原始列表不变:

var sortedCats = cats.OrderBy(x => x, new CategoryComparer());