2016-12-15 82 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

現在,它的工作原理!謝謝! –