4

プロジェクト内に一連の .NET アセンブリがあります。それらを依存関係で並べ替えたいと思います。

だから私が持っている場合(例えば):

IEnumerable<Assembly> unsorted = LoadAssembliesFromFolder();

私は呼び出すことができるようにしたい:

var IEnumerable<Assembly> sorted = unsorted.SortByDependency();

実際には、結果のセットは、Visual Studio のプロジェクト ビルド順序ダイアログのように見えることを願っています。

何かご意見は?かなりの時間がかかる可能性のある反復的なアプローチに行きたくありません。

乾杯

4

3 に答える 3

0

@Stevenの答えが遅すぎることがわかったので、次のように思いつきました:

public class AssemblyItem {
    public Assembly Item { get; set; }
    public IList<AssemblyItem> Dependencies { get; set; }

    public AssemblyItem(Assembly item) {
        Item = item;
        Dependencies = new List<AssemblyItem>();
    }
}

public static void Main() {
    // Get the assemblies
    var assemblyItems = BuildManager.GetReferencedAssemblies().Cast<Assembly>().OrderBy(a => a.FullName).Select(a => new AssemblyItem(a)).ToList();

    // Add the dependencies
    foreach (var item in assemblyItems) {
        foreach (var reference in item.Item.GetReferencedAssemblies()) {
            var dependency = assemblyItems.SingleOrDefault(i => i.Item.FullName == reference.FullName);

            if (dependency != null)
                item.Dependencies.Add(dependency);
        }
    }

    // Sort the assemblies
    var sortedAssemblyItems = assemblyItems.TSort(i => i.Dependencies);
}

以下の TSort 拡張メソッドを使用します。

https://stackoverflow.com/a/11027096/155899

この仕組みの詳細については、ウィキペディアの次の記事を参照してください。

http://en.wikipedia.org/wiki/Topological_sort

于 2014-02-07T09:58:57.630 に答える