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
interface を実装するクラスがありますIComparer<>
。比較は、コレクション内
のそれぞれの位置に基づいています。要素は複製してはならず、すべてのタイプ(少なくとも で使用されるもの) を含む必要があります。O(1)の複雑さがあるため、パターンの順序を保存していました。Foo
pattern
pattern
Foo
list
Dictionary<>
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));
}
}