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)
工作正常,非常聪明。谢谢。我喜欢查询语法版本。