C# 基于其他列表或不同大小对列表进行排序

C# 基于其他列表或不同大小对列表进行排序,c#,.net,linq,sorting,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", ... }); List ordered=新列表(新字符串[]{“一”、“二”、“三”、…})

考虑以下列表:

List<string> ordered = new List<string> (new string [] { "one", "two", "three", ... });
List<string> sequence1 = new List<string> (new string [] { "two", "three", "ten", ... });
List ordered=新列表(新字符串[]{“一”、“二”、“三”、…});
List sequence1=新列表(新字符串[]{“2”、“3”、“10”、…});
列表
[ordered]
是包含所有可能值的超集

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

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


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

按索引排序应该有效:

var result = sequence1.OrderBy(ordered.IndexOf);
但是,如果可能有未在
中订购的项目
,则需要进行一些额外的处理:

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

使用索引作为排序标准,这不含LINQ:

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

您可以仅从
顺序1
中获取那些存在于
顺序1
中的内容:

from x in ordered where sequence1.Contains(x) select x
不过,这种方法效率较低



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

现在如何对它们进行排序?你能给我看一下密码吗?真他妈聪明。但是,如果结果是
-1
,那么可能值得检查一下。哇!我喜欢这个。必须测试一下。@GregRos添加了一个替代选项,如果有可能某些项目可能没有订购。@VijayaKrishnaParuchuri我想你可以以orderby结束。Nvm,现已修复。由于
ordered
始终是一个超级集合,
subset.OrderBy(ordered.IndexOf)
工作正常,非常聪明。谢谢。我喜欢查询语法版本。