list
是要排序的元素的集合。
pattern
是按特定顺序排列的元素的集合。
result
是list
根据 排序的元素的集合pattern
。
var list = new List<Foo> { new FooA(), new FooB(), new FooC(), new FooA(), new FooC(), new FooA(), new FooD() };
var pattern = new Foo[] { new FooB(), new FooC(), new FooD(), new FooA() };
var result = list.OrderBy(p => p, new MyFooComparer(pattern));
有一个MyFooComparer
实现接口的类IComparer<>
。
比较是基于每个集合Foo
在pattern
集合中的位置。pattern
元素不能重复,它们必须包含所有类型Foo
(至少是 中使用的那些list
)。
我曾经Dictionary<>
存储模式顺序,因为它具有 O(1) 复杂度。
public class MyFooComparer : IComparer<Foo>
{
private readonly Dictionary<Type, int> _pattern;
public MyFooComparer(IEnumerable<Foo> pattern)
{
_pattern = new Dictionary<Type, int>();
int i = 0;
foreach (var foo in pattern)
{
_pattern.Add(foo.GetType(), i);
i++;
}
}
public int Compare(Foo x, Foo y)
{
var xVal = _pattern[x.GetType()];
var yVal = _pattern[y.GetType()];
return xVal.CompareTo(yVal);
}
}
调用后:
foreach (var foo in result)
{
Console.WriteLine(foo.GetType().Name);
}
根据pattern
,您将获得:
FooB
FooC
FooC
FooD
FooA
FooA
FooA
编辑:
扩展名List<Foo>
:
static class MyExtension
{
public static IEnumerable<Foo> OrderByFoo<T>(this List<Foo> list, IEnumerable<Foo> patern)
{
return list.OrderBy(p => p, new MyFooComparer(patern));
}
}