请考虑以下列表:
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循环迭代超集,并尝试在子集中查找值并将其移动到相关位置。
列表中的项目数量永远不会超过几十个,排序操作将被谨慎调用,因此效率不是关键。
答案 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上进行了测试。