VB.NET:按另一个列表对列表进行排序

VB.NET:按另一个列表对列表进行排序,vb.net,Vb.net,如何按照另一个列表排序器中设置的顺序将somelist作为Listof T排序为Listof Integer?somelist和sortorder大小相同,索引范围从0到n。排序器列表中的整数决定排序顺序:somelist中项目X的新索引=排序器中项目X的值 像这样: somelist = (itemA, itemB, itemC) sortorder = (3, 1, 2) somelist.sort() somelist = (itemB, itemC, itemA) 我正在尝试使用预定义

如何按照另一个列表排序器中设置的顺序将somelist作为Listof T排序为Listof Integer?somelist和sortorder大小相同,索引范围从0到n。排序器列表中的整数决定排序顺序:somelist中项目X的新索引=排序器中项目X的值

像这样:

somelist = (itemA, itemB, itemC)
sortorder = (3, 1, 2)
somelist.sort()
somelist = (itemB, itemC, itemA)

我正在尝试使用预定义的排序顺序对几个大小相同的列表进行排序。

您可以使用LINQ,尽管我讨厌:

这将使用项目的重载来投影项目的索引。对象和索引存储在一个匿名类型中,用于排序,最后我选择对象并使用ToList构建有序列表

另一种方法是使用将两者合并为匿名类型:

Dim q = From x In somelist.Zip(sortorder, Function(t, sort) New With {.Obj = t, .Sort = sort})
        Order By x.Sort Ascending
        Select x.Obj 
somelist = q.ToList()
如果要按降序排列,那么首先要使用最高值,请在方法语法中使用OrderByDescending,并在查询中使用orderbyx.Sort descending


但是为什么您要将这些相关信息存储在两个不同的集合中呢?

您可以使用LINQ,尽管我讨厌:

这将使用项目的重载来投影项目的索引。对象和索引存储在一个匿名类型中,用于排序,最后我选择对象并使用ToList构建有序列表

另一种方法是使用将两者合并为匿名类型:

Dim q = From x In somelist.Zip(sortorder, Function(t, sort) New With {.Obj = t, .Sort = sort})
        Order By x.Sort Ascending
        Select x.Obj 
somelist = q.ToList()
如果要按降序排列,那么首先要使用最高值,请在方法语法中使用OrderByDescending,并在查询中使用orderbyx.Sort descending


但是,为什么要将这些相关信息存储在两个不同的集合中呢?

我猜优雅的答案涉及Linq…您可能需要添加该标记。由于预期结果,问题不清楚。如果排序器列表的内容指定了用于排序的值,则item1=3、item2=1、item3=2。所以结果应该是:第2项,第3项,第1项。@TimSchmelter你是对的,我的错。我已经编辑了这个例子,我猜这个优雅的答案涉及Linq…你可能想添加这个标签。由于预期的结果,这个问题不清楚。如果排序器列表的内容指定了用于排序的值,则item1=3、item2=1、item3=2。所以结果应该是:第2项,第3项,第1项。@TimSchmelter你是对的,我的错。我编辑了这个例子,事实上有很多不同的收藏,有时是相关的,有时不是。我希望能够在不合并相关集合的情况下执行排序。@kutas:上面并没有真正合并它们。它们只是在查询中链接,以便通过索引查找排序值。除了要排序的列表之外,原始集合不会被修改。我最终使用了第二种解决方案。谢谢事实上,有很多不同的收藏,有时是相关的,有时不是。我希望能够在不合并相关集合的情况下执行排序。@kutas:上面并没有真正合并它们。它们只是在查询中链接,以便通过索引查找排序值。除了要排序的列表之外,原始集合不会被修改。我最终使用了第二种解决方案。谢谢