C#按自定义要求对IEnumerable进行排序

时间:2013-07-16 08:30:27

标签: c# list

所以我想要使用自定义要求订购IEnumerable。基本上我希望通过DocumentId订购它,但我有点挑剔/具体,所以我需要它们这样订购..

1st = ID 3
2nd = ID 5
3rd = ID 2
4th = ID 4
5th = ID 6

这是因为这些ID与预定图像匹配,图像需要按此顺序显示。

任何人都想到这样做的方法。

1 个答案:

答案 0 :(得分:8)

您可以使用以下方法。

int[] orderedIds = { 3, 5, 2, 4, 6 }
var result = enumerable.OrderBy(x => Array.IndexOf(orderedIds, x.Id));

这假设所有orderedIds都包含所有可能的ID。如果不是这种情况,这种方法会在所有其他项之前对具有未知ID的项进行排序。很可能这不是你想要的,所以在这种情况下,你可能想要使用这样的东西:

var result = 
    enumerable.Select(x => new { Item = x,
                                 Index = Array.IndexOf(orderedIds, x.Id) })
              .OrderByDescending(x => x.Index != -1)
              .ThenBy(x => x.Index == -1 ? x.Item.Id : x.Index)
              .Select(x => x.Item);

这会将具有未知ID的项目放在结果的末尾,并按ID对其进行排序。