2017-11-18 281 views
1

我有一種方法可以接受string[]。它採用這個數組並根據我們擁有的自定義代數公式對其進行排序。這個代數公式是相當複雜的,不能(或不應該)適應除IEnumerable<string>之外的其他任何東西。快速對對象列表進行排序以匹配包含屬性值的數組的順序

我的任務是爲此方法創建一個包裝函數,該函數接受IEnumerable<T>,其中T實現了一個接口,該接口公開要用於排序的字符串。

基於此,我創建了一個迭代遺傳枚舉的方法,提取字符串並將結果數組傳遞給我們的自定義排序函數。這工作,但我結束了一個排序的字符串數組,完全斷開原來的IEnumerable <T>。我如何排序IEnumerable <T>以匹配從我們的自定義排序函數返回的字符串數組?

例如。

private IEnumerable<T> Sort(IEnumerable<T> objects) where T: ICustomSortable 
{ 
    string[] stringsToSort = new string[objects.Count()]; 
    for (int i = 0; i < stringsToSort.length; i++) 
     stringsToSort[i] = objects.getString(); 

    stringsToSort = customSortFunction(stringsToSort); 

    //somehow sort the objects so that they are in the same order as stringsToSort? 
    /* 
    The result is valid when: 
    objects[0].getString() == stringsToSort[0] 
    objects[1].getString() == stringsToSort[1] 
    objects[2].getString() == stringsToSort[2] 
     ... 
    objects[n].getString() == stringsToSort[n] 
    */ 
} 

編輯:從customSortFunction檢索的字符串可能不是唯一的。這意味着兩個字符串相同的objects都應該存在於結果中。雖然具有相同字符串值的objects的排序是無關緊要的,但在整體引用結果時應該保持原樣。

+0

您是否需要使用customSortFunction()作爲一個整體?你能比較兩個字符串嗎?像'bool customCompare(string1,string2);'? – realharry

+0

不需要我必須使用自定義功能。我必須將它作爲一個整體傳遞給它。 –

+0

好的。我想這是因爲性能的原因?因爲可以通過調用'customSortFunction()'並在排序前後比較對,輕鬆實現'customCompare()'函數。 (一對是一個列表,畢竟是一個2元素的列表。) – realharry

回答

2

你需要的是從對象字符串值到對象本身的映射。像

IDictionary<string, T> 

東西(前或選後)剛創建這個映射,和排序基於它們的字符串值完成後,創建T的新排序列表,通過了(排序)字符串列表進行迭代,並使用映射得到相應的T.編輯:基於字符串值可能不是全部不同的評論,所有你需要做的就是創建一個從字符串映射到TS的集合/列表。喜歡的東西,

IDictionary<string, IList<T>> 

[A]當您通過IEnumberable循環,(1)如果你看到一個新的(串)鍵,創建一個新的列表,並添加所有者T代表的字符串,和(2)如果您找到字典中已有的密鑰,請檢索列表,然後將新的所有者T追加到列表中。

[B]排序完成後,通過排序的字符串/鍵列表,並找到相應的Ts(一個或多個),並通過連續添加Ts創建一個新的Ts列表。

這不是最優雅的方式(更好的方法顯然是使用某種比較器),但它很簡單,並且可以完成工作。

+0

我沒有指定,但我會編輯我的問題。雖然不太可能,但字符串可能並不唯一。 –

+0

我認爲這種方法仍然可以追求,但是您必須使用[Object.ReferenceEquals](https://msdn.microsoft.com/zh-cn/library/system.object)創建實現相等性的替代密鑰類型。的ReferenceEquals(V = vs.110)的.aspx)。這樣,具有相同值的不同字符串實例在字典中不會相同。只需留意那條老狗[String.Intern](https://msdn.microsoft.com/en-us/library/system.string.intern(v = vs.110).aspx)。 – allonhadaya

+1

我在這個算法中看到的唯一問題(除了它可能不是最有效的事實之外)是排序可能不穩定。如果原始字符串排序算法不穩定,那麼這不是問題。但是,如果原始字符串是穩定的,那麼您將通過執行一對多映射來丟失該屬性。 – realharry

相關問題