鉴于以下内容:
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可能有更好的东西我可以使用,但如果不是哦哦。只是寻找其他输入,看看是否有其他人有更好的方法。
答案 0 :(得分:3)
您可以使用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));
答案 1 :(得分:3)
您可以使用以下内容:
var ordered = listOfFoo.OrderBy(x => Array.IndexOf(sortOrderIds, x.Id));
这会根据sortOrderIds
中ID的顺序对它们进行排序。未找到ID的Foo
个对象将位于结果列表的最顶部。
如果您希望它们位于底部,请更改以下代码:
var ordered = listOfFoo.OrderBy(x =>
{
var idx = Array.IndexOf(sortOrderIds, x.Id);
return idx == -1 ? int.MaxValue : idx;
});