我有一个由以下类组成的列表:
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
有没有办法做到这一点?
谢谢。
答案 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)
有几种方法可以做到这一点:
在特定属性上使用LINQ,因为您提到ID:
var sortedCats=cats.OrderBy(x => x.id).ToList();
答案 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());