【问题标题】:Order list in Certain Order in C# .NETC# .NET 中特定顺序中的顺序列表
【发布时间】:2014-04-12 23:32:58
【问题描述】:

我有一个由以下班级组成的清单:

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

有什么办法吗?

谢谢。

【问题讨论】:

  • 你看过 LINQ 吗?

标签: c# .net list


【解决方案1】:

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

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();

【讨论】:

  • 这是错误的! OrderBy 没有就地排序,它返回一个 Orderd Enumerable。
  • 确实如此,但我并不打算暗示它确实如此。我添加了目标变量以使其更清晰。
【解决方案2】:
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】:

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

【讨论】:

    【解决方案4】:

    创建自定义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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2010-09-24
      • 2019-07-02
      • 2017-04-08
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多