2016-12-15 5 views
-2

プロジェクト内で特定のソートメカニズムを実装する必要があります。特定の並べ替えを実装する方法は?

コンテキスト:エンドユーザは、利用可能な場合、最初にいくつかのアイテムを見ることを望みます。

private List<string> SpecialSort(string[] all, string[] pref) 
{ 
    //I want to return my total collection: sorted like specified in my prefered order. 
    return all.ToList(); // But now in the correct order! 
} 

[TestMethod] 
public void TestSpecialSort() 
{ 
    //Arrange 
    var myTotalColllection = new[] { "foo", "bar", "baz", "qux", "corge", "waldo", "thud" }; 
    var myPreferedOrder = new[] { "waldo", "absint", "foo", "baz" }; 

    //Act 
    var result = SpecialSort(myTotalColllection, myPreferedOrder); 

    //Assert 
    var expectedResult = (new[] { "waldo", "foo", "baz", "bar", "qux", "corge", "thud" }).ToList(); 
    Assert.IsTrue(result.SequenceEqual(expectedResult)); 
} 

.NETフレームワーク内にこのソート機能が存在していることに気づいていませんが、存在する場合は私に教えてください。

+0

を試すことができますか?プログラミングに関する質問です。ソートメカニズムを実装することです。私は、要件がユーザーが指定した順序でアイテムを表示するために「持っているのがいい」というような多くの状況に遭遇しました。ユーザーが指定した注文は、しばしばコレクション全体をカバーしていないか、時には手元のコレクションでは利用できないアイテムです。 –

答えて

1

あなたはなぜこの質問を人々ダウン投票され、この

var result = myTotalColllection 
    .OrderBy(x => Array.IndexOf(myPreferedOrder, x)<0?int.MaxValue: Array.IndexOf(myPreferedOrder, x)) 
    .ToArray(); 
+0

あなたの答えも動作します! –

1

myPreferedOrderを反復して、それぞれallにあるものを最初に移動します。

private List<string> SpecialSort(string[] all, string[] pref) 
{ 
    List<string> listed = all.ToList(); 
    foreach (string s in pref.Reverse()) 
     if (listed.Contains(s)) 
     { 
      listed.Remove(s); 
      listed.Insert(0, s); 
     } 
    return listed; 
} 
+0

これは機能しました!ありがとうございました! –

関連する問題