基于另一个列表对动态对象列表进行排序
我有两个列表。一个是动态的对象列表。另一个是字符串列表。我想根据另一个列表对对象列表进行排序。基于另一个列表对动态对象列表进行排序
List<dynamic> List1; // Object1,Object2,Object3,Object4
List <String> List2; //"abc","bcd","da"
这些对象具有必须对其进行排序的属性“字母”之一。
对象可能不等于第二个列表中的元素数。
如果这两个列表的索引与您希望的方式保持一致,那么可能会发生这样的情况。您必须确保列表具有相同的长度才能正常工作。
var result = list1
.Select((item, index) =>
new
{
Item = item,
Order = list2[index]
})
.OrderBy(x => x.Order)
.Select(x => x.Item);
如果它们长度不一样,订单的标准是什么?那将是一个未定义的问题。一种方法是将它们放在列表的最后。
var result = list1.Take(list2.Length)
.Select((item, index) =>
new
{
Item = item,
Order = list2[index]
})
.OrderBy(x => x.Order)
.Select(x => x.Item);
var concatted = result.Concat(list1.Skip(list2.Length));
'list2 [index]' - “对象可能不等于第二个列表中的元素数量。”根据OP的帖子。 –
一旦索引太大,这会抛出一个'IndexOutOfRange'。 OP声明列表不等长。 –
在答案中注明。 – DLeh
好吧,假设列表1中包含对象的列表,每个对象包含称为“字母”的属性,并且要排序的对象的这份名单中,但排序顺序在列表2中指定其中有在排序顺序字母的可能值,那么你可以这样做:那么
int i=0;
var List2WithRowNum = from str2 in List2.AsEnumerable() select new{ rowNum = i++, str2 };
var sortedList = from obj1 in List1.AsEnumerable()
join strKey in List2WithRowNum.AsEnumerable() on ((listObject)obj1).alphabet equals strKey.str2
orderby strKey.rowNum
select obj1;
排序列表将是他们的“字母”属性排序,列表2为了您的原始对象(从列表1)的列表。
如果一个列表包含3个元素('List2'),另一个列表包含4个('List1'),则会很有趣:-) – xanatos
不确定您对此的期望如何,没有多大意义。 –
这里预计什么*确切*排序会如何影响任何事情? –