按属性和这些属性的有序数组对 IEnumerable 进行排序

本文关键字:属性 Object IEnumerable 排序 数组 序数 | 更新日期: 2023-09-27 17:56:00

给定以下内容:

public class Foo
{
  /* other properties */
  public Int32 Id { get; set; }
}
var listOfFoo = new[]{
  new Foo { Id = 1 },
  new Foo { Id = 2 },
  new Foo { Id = 3 }
};
var sortOrderIds = new[]{
  2, 3, 1
};

如果我想对listOfFoo进行排序以使Id以与sortOrderIds中显示的顺序相同的顺序结束,最好的方法是什么?我假设我可以使用以下内容进行排序:

Int32 SortUsingIdArrayAsReference(Foo x, Foo y)
{
  // creative license on "IndexOf", bear with me
  return Int32.CompareTo(sortOrderids.IndexOf(x.Id), sortOrderIds.indexOf(y.Id));
}

但这真的是最好的方法吗?我希望 LINQ 可能有更好的东西可以使用,但如果没有,那就好了。只是寻找其他输入,看看是否有其他人有更好的方法。

按属性和这些属性的有序数组对 IEnumerable<Object> 进行排序

您可以使用List.IndexOf

var ordered = listOfFoo.OrderBy(o => sortOrderIDs.IndexOf(o.Id));

编辑:由于sortOrderIDs是一个数组:

var ordered = listOfFoo.OrderBy(o => Array.IndexOf(sortOrderIds, o.Id));

或者,如果要对列表和数组使用相同的内容,请将其转换为IList

var ordered = listOfFoo.OrderBy(o => ((IList)sortOrderIds).IndexOf(o.Id));

你可以使用这样的东西:

var ordered = listOfFoo.OrderBy(x => Array.IndexOf(sortOrderIds, x.Id));

这将根据 sortOrderIds 中 ID 的顺序对它们进行排序。 Foo找不到 ID 的对象将位于结果列表的最顶部。

如果您希望它们位于底部,请像这样更改代码:

var ordered = listOfFoo.OrderBy(x => 
                                {
                                    var idx = Array.IndexOf(sortOrderIds, x.Id);
                                    return idx == -1 ? int.MaxValue : idx;
                                });