Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 排序IEnumerable<;对象>;按属性和这些属性的有序数组_C#_Linq_Sorting - Fatal编程技术网

C# 排序IEnumerable<;对象>;按属性和这些属性的有序数组

C# 排序IEnumerable<;对象>;按属性和这些属性的有序数组,c#,linq,sorting,C#,Linq,Sorting,鉴于以下情况: 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 }; 如果我想对listofoo进行排序,使Ids以与sortOrd

鉴于以下情况:

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
};
如果我想对
listofoo
进行排序,使
Id
s以与
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能有更好的我可以用的东西,但如果不是的话,那就好了。只需寻找其他输入,看看是否有其他人有更好的方法。

您可以使用

编辑:由于
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));
var ordered = listOfFoo.OrderBy(x => 
                                {
                                    var idx = Array.IndexOf(sortOrderIds, x.Id);
                                    return idx == -1 ? int.MaxValue : idx;
                                });
这将根据
sortOrderIds
中ID的顺序对它们进行排序
Foo
找不到ID的对象将位于结果列表的顶部

如果希望它们位于底部,请按如下方式更改代码:

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

我认为指数是最好的选择,但我想我会看看是否有其他方法。感谢您的反馈。:-)请注意,如果列表的大小很小,这是一个很好的解决方案。如果不是,那么它就不能很好地扩展,因为你正在对每个项目进行线性搜索。@Servy:幸运的是,我处理的是一小部分数据,但是如果这是一个更大的集合,你会提出什么建议?@BradChristie:最好的方法是让列表已经排序(f.e.,因为它来自数据库)。其次,order属性是
Foo
的一部分。如果您需要将订单存储在不同的集合中,您可以使用
字典
(键是
Id
,值是
索引
)。但首先我要问的是,这是否是一个问题,否则你就是。@TimSchmelter:他要求的更多的是一般性的调查,而不是实施。我对
.OrderBy(x=>Array.IndexOf(ari,x))
非常满意,但问问题也没什么坏处。;-)谢谢,这基本上是我计划的方向,只是不知道是否有更好的方法。谢谢你的快速回复。