根据其他列表或不同大小对列表进行排序

时间:2013-12-01 10:04:58

标签: c# .net linq sorting

请考虑以下列表:

List<string> ordered = new List<string> (new string [] { "one", "two", "three", ... });
List<string> sequence1 = new List<string> (new string [] { "two", "three", "ten", ... });

列表[ordered]是包含所有可能值的超集。

列表[sequence1][ordered]列表的随机排序子集。它可能包含部分或全部超集的元素。

我目前有一个冗长的功能,根据[sequence1][ordered]进行排序,并想知道是否有更简单的Linq方法。当前方法使用for循环迭代超集,并尝试在子集中查找值并将其移动到相关位置。

列表中的项目数量永远不会超过几十个,排序操作将被谨慎调用,因此效率不是关键。

2 个答案:

答案 0 :(得分:12)

按索引排序应该有效:

var result = sequence1.OrderBy(ordered.IndexOf);

但是,如果某些项目不在ordered中,则需要进行一些额外处理:

var result = from n in sequence1
             let i = ordered.IndexOf(n)
             orderby i == -1 ? ordered.Count : i
             select n

答案 1 :(得分:3)

使用索引作为排序条件,这没有LINQ:

sequence1.Sort
(
    (x, y) =>
    {
        return ordered.IndexOf(x).CompareTo(ordered.IndexOf(y));
    }
);

您可以从ordered仅使用sequence1中存在的内容:

from x in ordered where sequence1.Contains(x) select x

尽管如此,这种方法效率较低。


这些方法已经在LINQPad上进行了测试。